Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用scanf后getchar无法正常工作_C_Scanf_Getchar - Fatal编程技术网

在C中使用scanf后getchar无法正常工作

在C中使用scanf后getchar无法正常工作,c,scanf,getchar,C,Scanf,Getchar,我在写这段代码: int b; char c; scanf("%d", &b); while((c = getchar()) != EOF) { if(c >= 9 || c < 0) { printf("Invalid number!\n"); exit(0); } } intb; 字符c; scanf(“%d”和“b”); 而((c=getchar())!=EOF){ 如果(c>

我在写这段代码:

int b;
char c;

scanf("%d", &b);

while((c = getchar()) != EOF) {
    if(c >= 9 || c < 0) {
        printf("Invalid number!\n");
        exit(0);
    }
}
intb;
字符c;
scanf(“%d”和“b”);
而((c=getchar())!=EOF){
如果(c>=9 | | c<0){
printf(“无效数字!\n”);
出口(0);
}
}
当我分配
b
时,自动地
c
等于
b
。 例如,如果我对
b
的输入是
10
,它会自动进入
if
-语句并退出代码

有人知道原因吗?

发现问题并解决问题 下面列出的代码中有大量错误。

  • 报告说:

    getchar()
    相当于
    getc(stdin)

    getc()的原型是:

    int getc(FILE *stream);
    
    也就是说,
    getchar()
    返回一个整数(从
    unsigned char
    cast)。因此,我们需要将类型从
    char
    更改为
    int
    ,以正确接受其返回值

    请注意,
    EOF
    不是有效的
    无符号字符
    它扩展为
    有符号整数
    -1

  • 永远不要忽略函数的返回值。它返回正确传递的参数数。在这种情况下,为了使代码可靠,我们应该:

    if(scanf(“%d”、&b)!=1){
    fprintf(stderr,“值必须是整数。\n”);
    返回退出失败;
    }
    
  • 条件中存在语义错误:

    if (c >= 9 || c < 0)
          ^^____________ logically, 9 is a valid one digit number
                         so removing '=' from here makes more sense
    
    如果(c>=9 | | c<0)
    ^^____________从逻辑上讲,9是一个有效的一位数
    因此,从这里删除“=”更有意义
    
    值得注意的是,比较器的条件和类型都应该改变。请参阅下一步

  • 固定循环应如下所示:

    while((c=getchar())!=EOF){
    if(c=='\n')//因为c=getchar()也可以是'\n'
    继续;//因此,最好忽略
    
    如果(c>='0'&&c检查
    scanf
    的返回值,然后从那里开始
    getchar
    返回
    int
    。如果
    c
    不是
    int
    类型,则无法可靠地检查EOF。如果输入文件是文本,则
    c>=9
    极有可能是真的。也许你的意思是
    如果(c>='9'| | c<'0')
    这与如果(c>=9 | | c<0)
    您提供了什么输入?您是否在单独的行上为
    scanf
    getchar
    提供了输入?如果是这样,
    getchar
    将读取
    scanf
    留下的未读新行。
    而(scanf(“%d”,&b)!=1){fputs(“错误:无效的整数输入。\n”,stderr);for(int c=getchar();c!='\n'&&c!=EOF;c=getchar()){}
    正确的想法:使用
    int c
    ,错误的原因:“注意EOF不是有效的字符!它扩展为-1”-->-1是有符号的
    char
    int
    的有效值,该值用于区分256个
    未生成的char
    值和
    EOF
    1 
    10    // --- Note: 10 are two chars for two getchars
    Valid number 49 1.
    Valid number 48 0.
    3
    Valid number 51 3.
    9
    Valid number 57 9.
    - 
    Invalid number.
    a
    Invalid number.
    <
    Invalid number.
    .
    Invalid number.