#include <stdio.h>
int main()
{
int x=getlength("Hello",10);
printf("%d",x);
}
int getlength(char line[],int limit)
{
int x;
for(x=0;x<limit-1 && line[x]!=EOF && line[x]!='\n';++x)
printf("%c",line[x]) ;
printf("\n");
return x;
}
所以这段代码似乎输出了这个: 你好%d然后它在新的第9行输出
我不明白的是%d来自何处以及Hello%d的长度等于9
如果有人能解释我会很开心。
答案 0 :(得分:1)
C中的字符串以空字符'\0'
终止。更改for
循环以测试空字符而不是EOF
:
for (x=0; x < limit - 1 && line[x] != '\0' && line[x] != '\n'; ++x)
函数使用常量EOF
来表示文件的结尾,但它不用于终止字符串。这是因为二进制文件可以包含值为0到255的(无符号)字符。为了使函数能够发出文件结束信号,它必须返回一个不能出现的值文件。我见过的每个实现都使用EOF
= -1,因为无符号字符永远不会为负。
另一方面,字符串只能包含有效(无符号)字符,因此不能使用EOF
标记其结尾。相反,它使用'\0'
,它相当于整数0,并且是一个vailid但不可打印的字符。
答案 1 :(得分:0)
你for
循环只计为9,因为它永远不会在字符串“Hello”中找到EOF或换行符。
字符串“Hello”以空字符'\0'
终止,因此将for循环的一部分更改为line[x]!='\0'
答案 2 :(得分:0)
尝试测试NUL字符值:
int getlength(char line[],int limit)
{
int x;
for(x=0;x<limit-1 && line[x]!='\n' && line[x]!='\0'; ++x)
{
printf("%c",line[x]) ;
}
printf("\n");
return x;
}
答案 3 :(得分:0)
'Hello'的长度是5.我的预感是你正在从堆栈框架中读取这些字符。 即使在堆栈上的'hello'之后,您也在从位置读取。这就是堆栈上的内容。 可能来自printf中的'%d'。