我从非常简单的代码中得到非常意外的输出
char ch = getchar(), word[100], *p = word;
while (ch != '\n') {
*(p++) = ch;
ch = getchar();
}
puts(word);
任何17个字符输入的输出都附加“时间”,如
12345678901234567time
如果超过“时间”会被覆盖,如
1234567890123456789me
我做错了吗?
答案 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)
您的代码中存在多个问题:
puts()
的字符串,调用未定义的行为......在你的情况下,word
中最后一个从{{1}读取后出现的任何字符在这些之后打印,直到(希望)最终在内存中找到stdin
字节。'\0'
中的一个字节读入stdin
变量:这不允许您检查char
,实际上您不会检查。{/ li>
EOF
数组调用未定义的行为,则会在结尾之外写入字节。如果在从word
读取'\n'
之前遇到文件末尾,则肯定会在缓冲区末尾写入...例如,尝试将空文件作为程序的输入。< / LI>
以下是更正后的版本:
stdin