【问题标题】:prevent reading and returning of string value防止读取和返回字符串值
【发布时间】:2014-11-08 20:22:13
【问题描述】:
int getIndex(){
    int index = 0;
    do{
        printf("Enter your Index(0..80),-1 to STOP,-2 to RESTART,-3 to START NEW BOARD: ");
        scanf("%d", &index);
    } while (!(index >= -3 && index <=80));

    return index;

}

您好,鉴于我已经用 C 语言为数独游戏板编写了上述方法。我能做些什么来防止用户输入字母?并一直提示直到得到有效的输入。我刚刚开始 C 。限制我的是 scanf 标志说明符,我指定了一个 int 标志,这意味着如果用户输入一个字符串,我就搞砸了。

【问题讨论】:

  • 你好,如果用户输入了无效输入,我想再次提示。
  • 需要查看scanf的返回值。阅读该函数的文档。
  • 如果您刚开始使用 C,请注意以下建议:永远不要使用 scanf。 scanf 几乎从不在生产代码中使用,仅在学习语言时有用。使用它会完全扭曲你对语言的学习,这阻碍了它作为学习工具的应用。使用fread 并使用strtol 解析数据。这是一次很好的学习经历。
  • @WilliamPursell “将完全扭曲你对语言的学习”。嗯,这是一个意见。还有一个:在学习语言的同时使用scanf 是完全可以的。

标签: c


【解决方案1】:

您只需检查scanf 的返回值,然后在输入任何无效输入时从输入缓冲区(stdin) 中清除该字符。因此,将您的代码更改为以下内容:

int getIndex()
{
    int index = 0;

    while(1) //infinite loop
    {    printf("Enter your Index(0..80),-1 to STOP,-2 to RESTART,-3 to START NEW BOARD: ");
        if(scanf("%d", &index)==1) //scanf is successful scanning a number(input is a number)
        {
          if(index >= -3 && index <= 80) // if input is in range
          break; //break out of while loop
          printf("Number must be in range of -3 to 80\n"); //input is a number,but not in range
        }
        else  //input is not a number
        {
        scanf("%*s"); //Clear invalid input
        //printf("Invalid input\n");
        fprintf(stderr, "Invalid input\n"); //printf also works but errors are meant to be in the stderr
        }

    }

    return index;
}

【讨论】:

  • 错误属于标准错误。 fprintf(stderr, "Invalid input\n");
  • 标志 %*s 是什么意思?
  • @sutoL ,%*s 告诉scanf 扫描一个字符串(%s)然后丢弃它
  • @WilliamPursell ,这没有什么区别,因为这里没有输入重定向。但是,我已在代码中添加了您的建议
  • 请注意,如果发生输入错误或用户发出输入结束信号(Ctrl+D 在 UNIX 上,Ctrl+Z 在 DOS 上),则 scanf() 调用将返回 0 并且您将永远跳出无限循环。
猜你喜欢
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多