我正在尝试制作一个程序,直到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] = '\0';
return i;
}
int main(){
char word[MAX];
int d;
while((d = r_word(word))>0){
printf("%s\n", word);
}
return 0;
}
所以我的想法是r_word函数按字符在字符串's'中存储一个单词,以便它可以检查EOF。 但是,与我的期望不同,这就是我运行时的样子:
这些是[EOF]
这些
是
一些[然后它停在这里,仍然在循环中我猜] [再次击中EOF]
字
所以无论我输入多少单词,它都打印出除了最后一个单词之外的所有单词,然后程序就会挂起,直到我打印出最后一个单词时再次点击EOF。 有什么想法吗?
P.S。这是一个学校的例子,我们不允许使用任何先进的扫描方法,如fscanf或其他任何东西。只允许基本功能。
答案 0 :(得分:0)
添加&#34;空间&#34; &#34; EOF&#34;而不只是&#34; EOF&#34;,到最后一个词应该解决问题。
答案 1 :(得分:0)
看看下面的代码。而不是EOF&#39;我使用&#39; \ n&#39;,接着是一个小技巧来处理空格。我希望它有所帮助。
#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] = '\0';
printf("%s\n", word);
}
int main()
{
handleWords();
return 0;
}
答案 2 :(得分:0)
然后程序就会挂起,直到我打印出最后一个单词
时再次点击EOF
OP首先&#34; [点击EOF键]&#34;仅将键盘缓冲区刷新到stdin
。
此时,stdin
有"these are some words"
以及将打印出来的代码进程:
these<line feed>
are<line feed>
some<line feed>
"words"
完全阅读了fgetc()
,但r_word()
之后's'
仍在继续(c=getchar())
。
OP 2nd&#34; [点击EOF键]&#34;发出文件结束信号,因此EOF
收到words<line feed>
并发出最终结果。
<% if @render.header == true %>
<div class="header">
HTML
</div>
<% end %>
要解决此问题,请查看界面是否允许发出单个键盘事件,表示文件结尾或append a space。
或者,在输入行完成之前不要打印。