计算字符不起作用

时间:2013-06-25 23:31:22

标签: c

#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

如果有人能解释我会很开心。

4 个答案:

答案 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'。