我想使用while循环计算C中char数组的长度。
但如果我插入otto
,则返回5
的长度。不应该是4
正确答案吗?
char eingabe[255];
printf("geben Sie eine Zeile ein:");
fgets(eingabe, 255, stdin);
int i = 0;
while (eingabe[i] != '\0')
{
++i;
}
printf("Laenge: %d\n", i);
答案 0 :(得分:8)
eingabe
很可能包含:
{ 'o', 't', 't', 'o', '\n', '\0', junk ... }
答案 1 :(得分:7)
检查fgets()
的{{3}}。
在EOF或换行符后停止阅读。如果读取换行符,则将其存储到缓冲区中。
当您从stdin
阅读时,它会在提供的缓冲区中存储尾随的newline
[{1}}]字符。
将支票更改为\n
。希望这能解决你的问题。
答案 2 :(得分:1)
换行符'\n'
使fgets
停止读取,但它被函数视为有效字符,并包含在复制到结果的字符串中。如果您想避免这种情况,请使用fscanf
,如下所示:
fscanf(stdin, "%254[^\n]", eingabe);
请注意格式的限制:它小于缓冲区的实际长度以容纳空终止符。
注意:您可以使用strlen
来计算字符串的长度。它与您的for
循环完全相同:
int i = strlen(eingabe);
答案 3 :(得分:0)
eingabe
的大小为255.现在,如果您想要其中的初始化字符数,则应使用strlen
。但首先,插入此代码:
int n;
for(n = 0; n < 255; n++){
if(eingabe[n] == '\n'){
eingabe[n] = '\0';
}
}
eingabe[254] = '\0';
此代码用NULL字符替换'\ n'字符。如果没有这个,strlen
将返回错误的值。我还包括eingabe[254] = '\0';
,这样如果读入的字符串足够长,以至于换行符不适合缓冲区,那么仍然有一个NULL字符,以便strlen可以正常运行