我知道在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}}再次执行。也许我错过了一些东西。
答案 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并不是一个好主意。我宁愿检查好的阅读参数的数量。