2010-05-08 101 views
0

该程序要求输入一个数字。如果用户输入除数字以外的其他任何内容,该程序应循环scanf()函数。如何防止用户输入错误的输入?

的代码,

do{ 
    printf("Enter row number\n"); 
    scanf("%d",&row); 
    }while(row>='a' && row<='z'); 

但上面的代码不起作用。在输入信件时,我一直收到错误信息。我试图绕过它,整个事情无限循环。

有什么建议吗?

另外我怎么能告诉C Compiler不要打破循环,除非输入是INTEGER?

+7

防止用户输入不正确的输入它没有任何用户的唯一的傻瓜证明的方式! – Oded 2010-05-08 19:02:08

+0

这是C/C++吗? – IAbstract 2010-05-08 19:02:42

+1

你为什么用'%d'读一个'char'? – kennytm 2010-05-08 19:04:23

回答

3

您忽略了scanf()的回报,它告诉您输入的信息是否准确无误(%d)。如果不准确,则必须进行错误恢复,这对于scanf()来说并不特别容易。大多数人采用'读取输入行然后解析'的方法,错误恢复比较简单。


我明白,返回值在错误检查必不可少,但如何扫描如果数字或字母?我可以说如果(输入!=(整数))或类似的东西?

这就是为什么人们不使用scanf()。如果将数据行放入缓冲区(字符数组)中,则可以随时检查数组的内容。如果您使用scanf(),则在scanf()决定发生错误之前,您无法获得可靠的数据处理机会。

<ctype.h>中的函数(通常也可用作宏)允许您对字符进行分类。 <stdlib.h>中的函数提供了从字符串到各种整数的可靠转换。

那么,你可以考虑一下做这样的事情:

char buffer[256]; 

while (fgets(buffer, sizeof(buffer), stdin)) 
{ 
    ...check contents of buffer using isdigit() etc... 
    ...or just plough ahead with... 
    long value; 
    char *end; 
    errno = 0; 
    value = strtol(buffer, &end, 0); 
    if (errno != 0 || (*end != '\0' && !isspace(*end)) 
     ...diagnose problems... 
} 

此代码是有点出我的联赛,此刻..有一个简单的方法?

好吧,我想你可以使用atoi()代替strtol(),从而简化了错误处理(因为它是不太精确):

char buffer[256]; 

while (fgets(buffer, sizeof(buffer), stdin)) 
{ 
    int value = atoi(buffer); 
    if (value == 0) 
    { 
     puts("zero read - exiting loop"); 
     break; 
    } 
} 

它没有得到比这更简单。我不知道你以前的解决方案的哪一部分是你无法接受的。替代方案,在我看来,是多fiddlier,涉及阅读一次一个字符和保存数字,并拒绝非数字:

char buffer[256]; 
char *dst = buffer; 
int c; 
int value; 

while ((c = getchar()) != EOF) 
{ 
    if (isdigit(c)) 
    { 
     *dst++ = c; /* Ignoring buffer overflow - bad! */ 
    } 
    else if (isspace(c)) 
    { 
     *dst = '\0'; 
     value = atoi(buffer); 
     break; 
    } 
    else 
    { 
     printf("Unexpected character '%c'!\n", c); 
    } 
} 

等等。在代码中需要解决各种问题 - 比如在错误的字符后重置指针,避免缓冲区溢出,以及处理数字符号等等,以及我宁愿留下的各种各样的东西如fgets()strtol()

+0

感谢您的回复,是的,我知道返回值在错误检查中至关重要,但如果扫描它的数字或字母,我该如何扫描?我可以说如果(输入!=(整数))或类似的东西? – NLed 2010-05-08 19:14:54

+0

感谢您的解释,但此代码目前有点不在我的联盟中。有没有更简单的方法? – NLed 2010-05-08 20:57:36

+0

@Zazu:解释完整,代码简单。你需要重读它,直到你理解它。例如,在这个答案中的第三个代码块是如何做到这一点,但不应该。第二个代码块调用自1977年以来已记录的两个函数。如果您无法了解fgets和atoi以及while循环的结构如何,那么是的,您已经脱离了联盟并且应该介绍编程。我们不会在这里为您编写代码,而且我们也无法让您阅读已写入的内容。 – msw 2010-05-09 02:50:58

0

您需要阅读字符,然后确定该字符是否为数字并根据需要进行转换。当你输入完字符后,你还需要检查一些特殊的字符,比如'q'或者什么来打断你的循环。

+0

谢谢,但我想知道转换是如何完成的。 – NLed 2010-05-08 19:14:00