【问题标题】:How to deal with wrong input C?如何处理错误的输入C?
【发布时间】:2014-02-03 19:38:19
【问题描述】:

初学者问题: 想象一下这种情况:我要求用户输入一个整数(通过使用 scanf 获取)但用户输入一个字符,因为程序到达了它的结尾......但我想克服它,让程序告诉他他提供了无效的输入并给了用户另一个输入输入的机会,我该怎么做?

【问题讨论】:

  • 如果您首先发布您尝试过的内容,您会得到更好的答案:-)
  • 使用循环,例如while,直到用户输入正常。如果你这样做,你实际上可以告诉他他做错了什么。
  • 使用 fgets() 将输入读取为字符串(文本行),并对其进行解析。如果不好,再写一行文字。

标签: c input scanf


【解决方案1】:

使用fgets(),然后使用sscanf()strtol()

int number;
char ch;
char *Prompt2 = "":
do {
  printf("%sEnter number :", Prompt2);
  Prompt2 = "Invalid input\n";  // Change Prompt2 
  buffer char[50];
  if (fgets(buffer, sizeof buffer, stdin) == NULL) {
    Handle_EOF();
  }  
} while (sscanf(buffer, "%d %c", &number, &ch) != 1);

使用strtol() 代替sscanf() 会增加+/- 溢出保护,因为它会设置errno

  char *endptr; 
  errno = 0;
  long number = strtol(buffer, &endptr, 10);
  if (errno || buffer == endptr || *endptr != '\n') Handle_Error(();

请参阅Read_long() 作为如何使用此函数的示例。

【讨论】:

  • 你还没有检查过EOF...我建议while (printf("Enter number: ") > 0 && fgets(buffer, sizeof(buffer), stdin) != 0) { ...scan etc... },但是还有很多其他方法可以处理EOF。
  • 这将允许123abc 作为输入。
  • @ooga 编辑提供句子方法或strtol()
【解决方案2】:

scanf 的返回值是成功扫描的参数个数。

【讨论】:

    【解决方案3】:

    初学者使用 stdio.h,这对于家庭作业来说非常好,只要您不期望任何花哨的东西,例如密码字段输入、输入编辑功能、打字时格式化、功能键和控制键处理等等。你可以用错误的输入做什么仅限于基础知识。

    如果你需要用 C 语言编写一个专业的应用程序,这是我们在 70 年代和 80 年代曾经做过的事情,在 C 语言中,你必须避免使用 stdio.h 并因此避免使用 scanf 作为输入。您必须检查您的操作环境和社区必须提供什么。 Cursesncurses 可以帮助您。在 MS-DOS 中,我们过去常常捕获中断以便对键盘进行绝对控制。在 Unix 中,我们使用 Bill Joy 的 termcapterminfo 库,这将允许您控制终端和键盘。以 vi 编辑器为例,它基于 termcap,curses 基于 terminfo。

    请记住,创建清晰的基于文本的用户界面并非易事,完全控制用户的输入也不是一件容易的事。幸运的是,这也不再是问题了,因为 Java 和 Swing 已经出现了......

    【讨论】:

      【解决方案4】:

      基本技术是检测问题(来自*scanf() 的意外返回值),然后读取该行的其余部分(将字符吞噬到换行符或 EOF),然后继续。

      或者,通常更好(尤其是因为错误报告可以报告整行),是使用fgets()getline()读取整行,然后使用sscanf()或其他技术解析该行,然后从那里出发。

      【讨论】:

        【解决方案5】:

        怎么样:

          int n;
          int c;
          printf("Please enter an integer: ");
          while (scanf("%d", &n) != 1) {
            while (!isspace(c = getchar()));
            ungetc(c, stdin);
            printf("You must enter a valid number. Try again.\n");
            continue;
          }
        

        【讨论】:

          【解决方案6】:

          您可以将用户的输入作为字符串读取,然后使用strtol() 将其设为整数。

          int main(void)
          {
            char* end;
            char number_temp[256];
          
            int number;  
          
            while(1)
            {
               puts("Give a number");
               scanf("%s",number_temp);
          
               number = strtol(number_temp, &end, 10);
          
               if (end)              //If there is an error the value of *end will be non zero
                  printf("try again");
               else
                  break;
            }
            return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-15
            • 1970-01-01
            相关资源
            最近更新 更多