如何确保用户输入数据是一个整数

时间:2014-02-06 00:15:44

标签: c

我是C的新手,但我知道C#。在C#中,我可以使用TryParse来确保用户输入正确的数据类型。

以下是我对C的基本代码:

int shallowDepth;

do
{
    printf ("\nEnter a depth for the shallow end between 2-5 feet: ");
    scanf ("%d", &shallowDepth);

    if (shallowDepth < 2 || shallowDepth > 5)
    {
        printf("\nThe depth of the shallow end must be between 2-5 feet.");
    }
}
while (shallowDepth < 2 || shallowDepth > 5);

问题是,如果我输入字符,例如“asdf”,程序会疯狂并反复说“输入2-5英尺之间的浅端深度:”。我不确定为什么会发生这种情况,但必须是因为它需要一个int而我正在传递字符。

那么在尝试将数据存储在变量中之前,如何验证用户输入的数据是否为int类型?谢谢。

3 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为%d scanf将拒绝触摸任何看起来不像数字的内容并将文本留在缓冲区中。下一次它将再次到达相同的文本,依此类推。

我建议您暂时放弃scanf并尝试fgets之类的内容,然后尝试strtoXXX系列中的其中一项功能,例如strtoul或{{1} }。这些函数具有明确定义的报告错误的方式,您可以轻松地提示用户提供更多文本。


例如你可以这样做:

strtoumax

此时您可以使用您的号码,但请注意:

  • 您可以指定要填充char str[LENGTH]; long x; if (!fgets(str, sizeof str, stdin)) { /* Early EOF or error. Either way, bail. */ } x = strtol(line, NULL, 10); 的指针,它将指向第一个不可接受的字符
  • 如果结果无法表示为strtol,则long将设置strtol。如果您打算测试,则必须在errno = ERANGE
  • 之前设置errno = 0

答案 1 :(得分:0)

如果您想使用scanf,则无法再进行测试。但你也不需要!

在您的代码中,如果用户未输入数字(或以数字开头的内容),scanf将返回0,因为它返回了可以读取的参数数量。 因此,您需要检查scanf的返回值,以检查是否可以读取任何内容。 其次,你需要删除仍在吹气中的所有东西。 你可以使用这样的东西:

while(getchar()!='\n');

如果你也想处理文件,你也应该在那里抓住EOF

答案 2 :(得分:0)

int shallowDepth;
int invalid;
do {
    int stat;
    invalid = 0;
    printf ("\nEnter a depth for the shallow end between 2-5 feet: ");
    stat = scanf ("%d", &shallowDepth);

    if(stat != 1){
        invalid = 1;
        while(getchar() != '\n');//clear stdin
    } else if (shallowDepth < 2 || shallowDepth > 5){
        invalid = 1;
        printf("\nThe depth of the shallow end must be between 2-5 feet.");
    }
}while (invalid);