C语言 阅读单词直到EOF



我正在尝试制作一个程序,在EOF之前读取单词,然后对这些单词做一些事情。它现在做什么并不重要,所以让我们说它立即将它们打印回来。所以这是它在控制台中的样子:

这些是一些单词[然后在这里我按了EOF键]

这些

一些

的话

这是我尝试过的方式:

#include <stdio.h>
#include <string.h>
#define MAX 21
int r_word(char s[]){
char c;
int i = 0;
while((c=getchar())!=EOF && c!=' '){
s[i] = c;
i++;
}
s[i] = '';
return i;
}
int main(){
char word[MAX];
int d;
while((d = r_word(word))>0){
printf("%sn", word);
}
return 0;
}

所以我的想法是,r_word函数在字符串"s"中逐个字符存储一个单词,以便它可以检查 EOF。 但是,与我的期望不同,这是我运行这个时的样子:

这些是一些词 [EOF]

这些

一些[然后它停在这里,我猜仍在循环中] [再次命中EOF]

的话

因此,无论我输入多少个单词,它都会打印出除最后一个单词之外的所有单词,然后程序只是挂在那里,直到我再次点击EOF打印出最后一个单词。 有什么想法吗?

附言这是一个学校示例,其中我们不允许使用任何高级扫描方法,例如 fscanf 或其他方法。仅允许使用基本功能。

在最后一个单词中添加"空格"EOF",而不仅仅是"EOF"应该可以解决问题。

看看下面的代码。我用""代替了"EOF",然后是处理空格的小技巧。我希望它有所帮助。

#include <stdio.h>
#include <string.h>
#define MAX 32
void handleWords()
{
int i = 0;
char input, word[MAX];
while((input = (char) getchar()) != 'n' && i < MAX-1)
{
if(input == ' ') input = 'n';
word[i++] = input;
}
word[i] = '';
printf("%sn", word);
}
int main()
{
handleWords();
return 0;
}

然后程序就挂在那里,直到我再次点击EOF打印出最后一个单词

OP 第一个"[按 EOF 键]"仅将键盘缓冲区刷新到stdin中。

此时,stdin具有"these are some words"和代码处理,这些过程将打印出来:

these<line feed>
are<line feed>
some<line feed>

"words"已经被fgetc()完全阅读了,但r_word()仍然在's'之后放弃一些东西。

OP 2nd"[按EOF键]"表示文件结束,因此(c=getchar())收到EOF并发生最终输出。

words<line feed>

若要补救,请查找接口是否允许单个键盘事件发出文件结束信号或追加空格。

或者,在输入行完成之前不要打印。

最新更新