我有这个,但是一旦达到假定的EOF,它就会重复循环并再次扫描。
int main(void)
{
char words[16];
while(scanf("%15s", words) == 1)
printf("%s\n", words);
return 0;
}
答案 0 :(得分:20)
尝试:
while(scanf("%15s", words) != EOF)
您需要将scanf
输出与EOF
由于您在格式字符串中指定宽度15
,因此您最多只能读取15个字符。因此,char数组的大小应为16
(15 +1
null
的大小char words[16];
。所以声明为:
{{1}}
答案 1 :(得分:4)
Scanf几乎总是比它的价值更麻烦。以下是两种更好的方法来做你想做的事情。第一个是对代码的或多或少的直接翻译。它更长,但你可以看一下它,看清楚它的作用,与scanf不同。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char buf[1024], *p, *q;
while (fgets(buf, 1024, stdin))
{
p = buf;
while (*p)
{
while (*p && isspace(*p)) p++;
q = p;
while (*q && !isspace(*q)) q++;
*q = '\0';
if (p != q)
puts(p);
p = q;
}
}
return 0;
}
这是另一个版本。通过检查看到它的作用有点困难,但如果一行超过1024个字符,它就不会中断,所以这是我在生产中使用的代码。 (好吧,真的我将在生产中使用的是tr -s '[:space:]' '\n'
,但这就是你实现类似的东西。)
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int ch, lastch = '\0';
while ((ch = getchar()) != EOF)
{
if (!isspace(ch))
putchar(ch);
if (!isspace(lastch))
putchar('\n');
lastch = ch;
}
if (lastch != '\0' && !isspace(lastch))
putchar('\n');
return 0;
}
答案 2 :(得分:3)
您的代码循环直到它读取单个单词,然后退出。因此,如果你给它多个单词,它将读取第一个并退出,而如果你给它一个空输入,它将永远循环。无论如何,它只会打印来自未初始化内存的随机垃圾。这显然不是你想要的,但你想要什么?如果您只想阅读并打印第一个单词(如果存在),请使用if:
if (scanf("%15s", word) == 1)
printf("%s\n", word);
如果您想循环阅读单词,请使用while:
while (scanf("%15s", word) == 1)
printf("%s\n", word);
另外,正如其他人所指出的那样,你需要给单词数组一个足够大的scanf大小:
char word[16];
其他人建议测试EOF而不是检查scanf匹配的项目数。这种情况很好,其中scanf不能匹配,除非有EOF,但在其他情况下不太好(例如尝试读取整数),其中scanf可能在没有达到EOF的情况下匹配任何内容(如果输入不是'数字)并返回0。
修改强>
看起来你改变了你的问题以匹配我运行时运行良好的代码 - 循环阅读单词直到达到EOF然后退出。所以你的代码还有其他的东西,或许与你如何按照David的建议提供输入有关。
答案 3 :(得分:0)
您需要针对EOF
检查返回值,而不是针对1
。
请注意,在您的示例中,您还使用了两个不同的变量名称words
和word
,仅声明了words
,并且没有声明其长度,应该是16到适合读入的15个字符加上NUL
个字符。
答案 4 :(得分:0)
伙计,如果您使用的是Windows,则按Enter键不会到达EOF,而是在控制台上按Crtl + Z。这将打印“ ^ Z”,这是EOF的指示。 读取此内容时的功能行为(EOF或Crtl + Z):
Function: Output:
scanf(...) EOF
gets(<variable>) NULL
feof(stdin) 1
getchar() EOF
答案 5 :(得分:-1)
我想最好的办法是......
int main()
{
char str[100];
scanf("[^EOF]",str);
printf("%s",str);
return 0;
}
答案 6 :(得分:-4)
对于C用户,这也可以使用
while ( gets(str) != NULL )