【问题标题】:integer validation gives infinite loop整数验证给出无限循环
【发布时间】:2017-03-10 10:44:39
【问题描述】:

用户需要输入一个整数,然后输入回车。如果它被验证,那么它应该返回整数,如果没有验证,用户应该得到一个错误消息。

当我尝试通过 getInt() 函数验证输入时,当我输入 1 个或多个字符时会出现无限循环。当我输入abc 时,我得到一个无限循环的错误消息,而输入1a 得到正确的验证(1 条错误消息)。我按照此流程图的指示进行操作:

代码

  #include <stdio.h>

  void clrKyb(void){
    char input;
    do {
      scanf("%c",&input);
    } while(input !='\n');
  }

  int getInt(void){
    char NL= 'x' ;
    int value ;

    while(NL!='\n'){

      scanf("%d%c",&value,&NL);

      if(NL!='\n') {

       void clrKyb(void);
       printf("Invalid integer, please try again:");

      }

    }   
    return value ;
  }


  int main(void) {
    int iVal;

    printf("Enter an integer: ");
    iVal = getInt();
    printf("You entered: %d\n", iVal);

    return 0;
  }

【问题讨论】:

  • getInt 中,void clrKyb(void); 应该只是clrKyb();,因为您想使用您已经定义的clrKyb
  • 请注意,在clrKyB()(和getInt())中,您需要检查来自scanf()的返回值。如果它返回 EOF,那么任何重试等都不会停止无限循环。 (正如 cxw 所指出的,目前在 getInt() 中,您(重新)声明 clrKyB() 并且不要调用它 - 这也是一个问题。)
  • 谢谢@cxw 和乔纳森·莱夫勒。将 void clrKyb(void) 更改为 clrKyb() 解决了我的问题。我不知道这样的事情会影响无限循环,我想我必须在 scanf 函数中添加一些东西。顺便说一句,我怎样才能通过评论来标记这个答案(我是新来的)。
  • @Jonathan Leffler
  • @elvisi27:在有答案而不是评论之前,没有正式的方式来接受答案。我将从两个有效的 cmets 中创建一个答案。由于这是一项共同努力,我将其设为“CW”(社区 wiki),这意味着 cxw 和我都不会从中获得任何积分,但您将能够接受它(您会获得奖金),并且问题将明显“完成”。

标签: c validation char scanf


【解决方案1】:

如 cmets 中所述:

cxwsaid:

  • getInt 中,void clrKyb(void); 应该只是clrKyb();,因为您想使用已经定义的clrKyb

Jonathan Lefflersaid:

  • 请注意,在clrKyB()(和getInt())中,您需要检查来自scanf() 的返回值。如果它返回 EOF,那么任何重试等都不会停止无限循环。 (正如cxw 所说,目前在getInt() 中,您(重新)声明clrKyB() 并且不要调用它——这也是一个问题。)

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2021-08-14
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多