读字直到EOF

时间:2018-01-11 18:02:39

标签: c scanf eof words

我正在尝试制作一个程序,直到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或其他任何东西。只允许基本功能。

3 个答案:

答案 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

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