C:扫描而不是EOF循环意外结果

时间:2017-01-26 02:52:05

标签: c scanf

我知道在scanf达到EOF之前,#include <stdio.h> int main(){ char thing; int i=0; while(scanf("%c", &thing) != EOF){ printf("time:%d, char:%c\n",i,thing); i++; } return 0; } 的同一主题有很多问题,但这是我未见过的特殊情况。假设我想创建一个用户输入单个字符的C程序,程序打印回字符和用户输入字符的次数,直到他们按下CTRL + D(EOF)

这就是我所拥有的:

f
time:0, char:f
time:1, char:

p
time:2, char:p
time:3, char:

m
time:4, char:m
time:5, char:

但是,输出不符合预期。它是以下内容:

i

我不太清楚为什么printf再次增加,以及为什么{{1}}再次执行。也许我错过了一些东西。

2 个答案:

答案 0 :(得分:0)

尝试

#include <stdio.h>

int main(){
  char thing;
  int i=0;
  while(scanf("%c", &thing) != EOF){
    if (thing!='\n') {
      printf("time:%d, char:%c\n",i,thing);
      i++;
    }
  }

  return 0;
}

答案 1 :(得分:0)

@ user2965071

char ch;
scanf("%c",&ch);

使用这样的片段,可以从流中读取任何ASCII字符,包括换行,返回,制表符或转义符。因此,在循环内部,我将测试用一个ctype函数读取的符号。

这样的事情:

#include <stdio.h>
#include <ctype.h>

int main(){
  char thing;
  int i=0;
  while(1 == scanf("%c", &thing)){
    if (isalnum(thing)) {
        printf("time:%d, char:%c\n",i,thing);
        i++;
    }
  }

  return 0;
}

至于我,我认为检查scanf返回EOF并不是一个好主意。我宁愿检查好的阅读参数的数量。