繁体   English   中英

我无法在 C 中将 argv 转换为上

[英]I'm having trouble converting argv to upper in C

我正在尝试将固定大小的 argv 转换为上和下,但它要么给我分段错误,要么只是在 var 上存储乱码。 我试过这个:

#include <stdlib.h>
#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(int argc, string argv[])
{
    string lower = "abcdefghijklmnopqrstuvwxyz";
    string upper = "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0, n = 26; i < n; i++)
    {
        lower[i] = tolower(argv[1][i]);
        upper[i] = toupper(argv[1][i]);
    }
}

或者:

string lower = "";
string upper = "";

//check if repeated chars or numbers
for (int i = 0, n = 26; i < n; i++)
{
    printf("%c\n",(char) argv[1][i]);
    printf("%c\n",(char) argv[1][i]);
    printf("%c\n",tolower(argv[1][i]));
    printf("%c\n",toupper(argv[1][i]));
    lower += tolower(argv[1][i]);
    upper += toupper(argv[1][i]);
}

最奇怪的部分是 printf 给出了正确的值,但它们并没有存储在lowerupper中。 我在这里做什么?

您不能在 C 到 append 中使用+=到字符串。

<cs50.h>string定义为char * 然后string lower = ""; lower定义为char *并将其设置为指向""的第一个字符。 ""表示一个null字符串,该字符串的第一个也是唯一一个字符是null(零值)字符,表示字符串的结束。

attempts to advance the pointer by elements of the type it points to.当应用指针时, += 尝试将指针前进它指向的类型的元素。 例如,如果指针p指向数组的元素 3,则p += 4将使其指向元素 7。

由于lower指向只有一个元素的数组元素,因此 null 字符lower += tolower(argv[1][i])试图使其指向数组外部。 C 标准未定义该行为。 (除非它可能在 C 实现中,其中应用于该字符的tolower会产生一个值为 1 的字符。这将修改lower以指向数组中的最后一个元素,这是一个特殊的 position 允许用于指针运算。 )

使用string lower = "abcdefghijklmnopqrstuvwxyz"; ,你有更多的空间来做数组运算; 一些添加到lower将起作用。 但是, tolower(argv[1][i])可能太大而无法保留在数组中。

此外,即使指针算术有效, lower += …也只会更改指针。 它不会改变它指向的字符。

为了使您的代码正常工作,您需要分配足够的 memory 来保存生成的字符串,包括 null 字符,并且您必须将lower设置为指向该 memory,类似地设置为upper 您需要的字符数是strlen(argv[1][i]) + 1 如果你已经学会了如何使用malloc ,你可以使用它。 如果您有保证argv[1]正好是 26 个字符的固定分配,您可以定义lower并通过用char lower[27]; ,对于upper也是如此。

然后,您必须将字符复制到该 memory 中,您可以使用lower[i] = tolower(argv[1][i]); . 将字符复制到数组中后,应在其末尾写入一个 null 字符,以形成一个完整的 C 字符串。 (如果您不打算将数组打印为字符串或以其他方式将其用作字符串,则可以省略它。)

如果您调用man toupper ,您将了解到 function 不采用字符串,而是采用字符。 因此,实现您所追求的一种方法是遍历命令行参数中的每个字符,对其调用toupper ,然后将结果存储回来。

#include <ctype.h>
#include <stdio.h>
#include <string.h>

void main(int argc, char *argv[])
{
  printf("before: %s\n", argv[1]);

  for (unsigned int i = 0, n = strlen(argv[1]); i < n; i++) {
    argv[1][i] = (char) toupper(argv[1][i]);
  }

  printf("after:  %s\n", argv[1]);  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM