【问题标题】:How to detect an invalid input by user in C? [closed]如何在 C 中检测用户的无效输入? [关闭]
【发布时间】:2020-03-03 20:08:54
【问题描述】:

我需要编写一个代码,让用户输入 3-69 之间的数字。如果输入不正确,我必须在 stderr 中打印"wrong input"(如果是字母)或"out of range"(如果它不属于间隔)。

我可以处理"out of range" stderr,但不能处理另一个。当我输入一个字母时,它会自动转换为一些大数字,我想这是内存中的地址或其他东西。在这种情况下,stderr 变为"out of range" 而不是"wrong input"。有办法解决吗?

也许我将变量引入为 int 是错误的?(这些是获取输入的代码行):

int x, y;
scanf("%i %i",&x,&y);

【问题讨论】:

  • 请发布重现该问题的完整但最少的代码。 int x, y; scanf("%i %i",&x,&y); 本身应该没问题,但当然它不支持字母,所以它会在那里停止解析。
  • 检查scanf的返回值。它会告诉你有多少参数被成功匹配。
  • 如果您希望能够输入数字和字母,请输入一个字符串,然后使用 atoi() 将其转换为整数。
  • 听起来练习的很大一部分是学习解析输入。如果是这种情况,请不要使用 scanf。此外,如果输入与预期不符,scanf 确实无法正常工作。由于您正在尝试处理意外输入的情况,因此请不要使用 scanf。

标签: c input scanf stderr


【解决方案1】:

当我输入一个字母时,它会自动转换成一个大数字,我想这是内存中的地址或其他东西。

这是xy 中的任何垃圾。

scanf("%i %i",&x,&y); 表示要查找两个整数。如果scanf 没有看到两个整数,它将失败并且不会向xy 写入任何内容。因为您没有检查scanf 是否成功,所以当您读取xy 时,它们将未初始化;它们将包含当时内存中的任何垃圾。

天真的方法是首先检查scanf 是否成功。然后检查数字是否在正确的范围内。为了便于说明,我将把问题简化为一个数字。

#include <stdio.h>

int main() {
    int num;
    while(1) {
        if( scanf("%i ",&num) != 1 ) {
            fprintf(stderr, "Please enter a number.\n");
            continue;
        }

        if( num < 3 || 69 < num ) {
            fprintf(stderr, "The number must be between 3 and 69.\n");
            continue;
        }

        break;
    }

    printf("Your number is %i.\n", num);
}

但是当用户输入“a”时就会进入一个无限循环。

$ ./test
a
Please enter a number.
Please enter a number.
Please enter a number.

scanf 失败时,它会将用户的输入留在stdin。上面的程序将一遍又一遍地读取相同的a。这是scanf 的一个普遍问题,它是为结构良好的输入而设计的,而用户输入的结构不是很好。见the C FAQ for more problems with scanf

相反,分别读取和解析。用fgets 读整行,用sscanf 解析它,如果不是你想要的读另一行。

#include <stdio.h>

int main() {
    int num;
    char line[1024];
    while(fgets(line, sizeof(line), stdin)) {
        if( sscanf(line, "%i ",&num) != 1 ) {
            fprintf(stderr, "Please enter a number.\n");
            continue;
        }

        if( num < 3 || 69 < num ) {
            fprintf(stderr, "The number must be between 3 and 69.\n");
            continue;
        }

        break;
    }

    printf("Your number is %i.\n", num);
}

【讨论】:

  • 这实际上非常有帮助。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2014-08-08
相关资源
最近更新 更多