puts()输出附加“time”字符串

时间:2016-08-09 16:27:07

标签: c getchar puts

我从非常简单的代码中得到非常意外的输出

char ch = getchar(), word[100], *p = word;

while (ch != '\n') {
    *(p++) = ch;
    ch = getchar();
}
puts(word);

任何17个字符输入的输出都附加“时间”,如

12345678901234567time

如果超过“时间”会被覆盖,如

1234567890123456789me

我做错了吗?

2 个答案:

答案 0 :(得分:2)

puts需要指向string的指针。并且string需要终止null character - \0 - 表示字符串结束的位置。

但是在你的情况下,你没有在最后写\0来表示字符串在那里结束。

你需要这样做:

char ch = getchar(), word[100], *p = word;

/* Also check that you are not writing more than 100 chars */
int i = 1;
while(ch != '\n' && i++ < 100){  
    *(p++) = ch; 
    ch = getchar();
}
*p = '\0'; /* write the terminaring null character */
puts(word);

之前,当你没有编写终止空字符时,你不能指望任何确定的打印。它也可能是12345678901234567AnyOtherWord或其他东西。

答案 1 :(得分:2)

您的代码中存在多个问题:

  • 你没有null终止传递给puts()的字符串,调用未定义的行为......在你的情况下,word中最后一个从{{1}读取后出现的任何字符在这些之后打印,直到(希望)最终在内存中找到stdin字节。
  • 。}
  • 您将'\0'中的一个字节读入stdin变量:这不允许您检查char,实际上您不会检查。{/ li>
  • 如果读取一个长行,如果EOF数组调用未定义的行为,则会在结尾之外写入字节。如果在从word读取'\n'之前遇到文件末尾,则肯定会在缓冲区末尾写入...例如,尝试将空文件作为程序的输入。< / LI>

以下是更正后的版本:

stdin