Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何记录字符串长度?_C_Printf - Fatal编程技术网

C 如何记录字符串长度?

C 如何记录字符串长度?,c,printf,C,Printf,我有一个带命令行参数的函数: int main(int argc, string argv[]) 我想存储参数,因此我声明了一个变量: string key = argv[1]; 这是一个字符串,我想把这个字符串从ASCII'A'=0,'B'=1等转换成字母索引。。所以我就这样走 printf("key length %lu\n", strlen(key)); for (j = 0, n = strlen(key); j < n; j++) { if(isupper(key[

我有一个带命令行参数的函数:

int main(int argc, string argv[])
我想存储参数,因此我声明了一个变量:

string key = argv[1];
这是一个字符串,我想把这个字符串从ASCII'A'=0,'B'=1等转换成字母索引。。所以我就这样走

printf("key length %lu\n", strlen(key));

for (j = 0, n = strlen(key); j < n; j++)
{
    if(isupper(key[j]))
    {
        key[j] = key[j] - 65;
    }
    else
    {
        key[j] = key[j] - 97;
    }
}

printf("key length %lu\n", strlen(key));
但不知怎的,这两张照片给了我不同的价值。似乎第二次打印总是给我1。我不明白为什么会这样。我可以用%I打印键[j],但当我要求%c时,它只留下空格。我错过了什么

对于您的代码,字符串中的第一个A或A将是循环后的0,即null终止符。所以strlen将在触发空终止符后停止计数字符

如前所述,大小类型的正确格式说明符为%zu

另一件小事:为了更具可读性,您可以使用'A'和'A'对字符串字符进行减法,而不是使用幻数,如

key[j] = key[j] - 'A';
在代码中,字符串中的第一个A或A将在循环后为0,即null终止符。所以strlen将在触发空终止符后停止计数字符

如前所述,大小类型的正确格式说明符为%zu

另一件小事:为了更具可读性,您可以使用'A'和'A'对字符串字符进行减法,而不是使用幻数,如

key[j] = key[j] - 'A';

strlen将计算字符数,直到遇到\0字符为止。我猜你说的这个词是A还是A?在这种情况下,您将在字符串中放入一个0,strlen将停在那里。

strlen将计算字符数,直到遇到\0字符为止。我猜你说的这个词是A还是A?在这种情况下,您将在字符串中放置一个0,strlen将在那里停止。

当您转换字符串时,您将a和a映射为0。0恰好也是字符串终止符字符的值,因此当您对转换后的字符串执行strlen时,它将在到达第一个A/A时停止计数


要跟踪长度,您需要记住转换前strlen的长度,并将其与缓冲区一起传递。

当您转换字符串时,将A和A映射为0。0恰好也是字符串终止符字符的值,因此当您对转换后的字符串执行strlen时,它将在到达第一个A/A时停止计数


要跟踪长度,需要记住转换前strlen的长度,并将其与缓冲区一起传递。

旁注:printfkey length%lu\n,strlenkey-->printfkey length%zu\n,strlenkeySide注2:main的正常签名应使用const char*args[],并强调常量。我真的不确定修改args是否是定义的行为……当您从每个字符中减去符号表时,您将字符串转换为整数数组。它不再是C字符串,因此不能再在其上使用字符串处理函数!?这个数据类型是什么?@StoryTeller可能是cs50.h库的一部分。我很确定其中使用了typedef char*字符串。旁注:printfkey length%lu\n,strlenkey-->printfkey length%zu\n,strlenkeySide注2:main的正常签名应该使用const char*args[],并强调const。我真的不确定修改args是否是定义的行为……当您从每个字符中减去符号表时,您将字符串转换为整数数组。它不再是C字符串,因此不能再在其上使用字符串处理函数!?这个数据类型是什么?@StoryTeller可能是cs50.h库的一部分。我很确定它使用了typedef char*字符串。@ChrisMaes一个秒的copule+1为you@ChrisMaes秒的连词+1给你