首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C: Scanning While not EOF循环意外结果

C: Scanning While not EOF循环意外结果
EN

Stack Overflow用户
提问于 2017-01-26 10:52:05
回答 2查看 272关注 0票数 0

我知道在谈到EOF之前,关于scanf的同一主题还有很多问题,但这里有一个我没有见过的特殊情况。假设我想要编写一个C程序,其中用户输入一个字符,该程序打印出该字符以及用户在按CTRL+D (EOF)键之前输入字符的次数。

这就是我所拥有的:

代码语言:javascript
复制
#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;
}

然而,输出并不像预期的那样。如下所示:

代码语言:javascript
复制
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会再次执行。也许我漏掉了什么。

EN

回答 2

Stack Overflow用户

发布于 2017-01-26 11:00:06

试一试

代码语言:javascript
复制
#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;
}
票数 0
EN

Stack Overflow用户

发布于 2017-01-26 12:24:44

@user2965071

代码语言:javascript
复制
char ch;
scanf("%c",&ch);

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

如下所示:

代码语言:javascript
复制
#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不是一个好主意。我更愿意检查好的读取参数的数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41865200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档