2
#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;
}

所以这段代码似乎输出了这个: Hello%d 然后它在新的第 9 行输出

我不明白的是 %d 来自哪里以及 Hello%d 的长度如何等于 9

如果有人能解释我会很高兴。

4

4 回答 4

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 并且是一个有效但不可打印的字符。

程序员的一个非常常见的陷阱是忘记这一点,或者忽略以空字符终止字符串(在这种情况下,程序通常会扫描到末尾到无效内存中),或者尝试操作包含二进制数据的字符串(有时包含一个空字符并意外终止字符串)。

于 2013-06-25T23:35:49.670 回答
0

'Hello' 的长度是 5。我的预感是您正在从堆栈帧中读取这些字符。即使在堆栈上的“你好”之后,您也正在从位置读取。这就是堆栈上的内容。可能来自 printf 中的“%d”。

于 2013-06-25T23:40:10.963 回答
0

for循环只计数到 9,因为它永远不会在字符串“Hello”中找到 EOF 或换行符。

字符串 "Hello" 以空字符终止'\0',因此将 for 循环的一部分更改为line[x]!='\0'

于 2013-06-25T23:34:42.063 回答
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;
}
于 2013-06-25T23:34:42.373 回答