2012-10-24 25 views
3

我想检查给定的输入是否是整数输入。我不想将输入存储在字符串中。看到在计算器和命中和审判的几个问题后,我已经创建了下面的代码scanf的工作和检查输入是int

while(scanf("%d%c",&num,&a) != 2 || a != '\n') 
{ 
    printf("Please enter an integer only : "); 
    if(a == '\n') 
     scanf("%c",&a); 
    else 
    { 
     while(a != '\n') 
      scanf("%c",&a); 
    } 
} 

它的工作原理,但据我的了解,下面应该有还曾

while(scanf("%d%c",&num,&a) != 2 || a != '\n') 
{ 
    printf("Please enter an integer only : "); 
    while(a != '\n') 
     scanf("%c",&a); 
} 

有人可以告诉我为什么上面没有工作?另外如果有人有更好的解决方案,请给它也。

注:我正在考虑12qwe也是一个无效输入。我只是想要整数。

+0

也许“%d%N”的格式是什么你需要。你也可以检查scanf()的返回值。 – wildplasser

+0

我做了你所说的。但它所做的是它正确地检查整数部分。但是,当正确输入整数时,它跳过我的代码中的下一个scanf()。/n在这里保持缓冲?我认为它不应该。 – Sahil

+0

不,我的意思是“%d%n”。 %n报告成功消耗字符的数量:在你的情况下,输入字符串中的数字字符的数量。之后,你可以循环,直到你得到'\ n'。 (实际上,你不需要%n;只是读取%d,然后循环直到'\ n') – wildplasser

回答

3

while(scanf("%d%c",&num,&a) != 2 || a != '\n') 
{ 
    printf("Please enter an integer only : "); 
    while(a != '\n') 
     scanf("%c",&a); 
} 

的问题是,如果a恰巧扫描前包含'\n',并且扫描失败,内部while循环根本不运行。所以

  • 如果扫描失败尝试从输入流解析int因为输入是如"ab c\n",有问题的输入保留在输入流中,下一个scanf在外环while环路控制失败,再次解析inta仍然'\n',重复。

  • 如果在将流中的字符读入a之前发生输入错误,外环控制中的scanf因流损坏而重复失败。

在其他版本中,

while(scanf("%d%c",&num,&a) != 2 || a != '\n') 
{ 
    printf("Please enter an integer only : "); 
    if(a == '\n') 
     scanf("%c",&a); 
    else 
    { 
     while(a != '\n') 
      scanf("%c",&a); 
    } 
} 

你做至少有一些进步,只要有输入从流中读取,因为无论a包含的,你看从至少一个字符在尝试下一个解析int之前的输入流。如果输入流被损坏/关闭/提前结束,它也将导致无限循环。如果你从一个空文件重定向stdin。通过给出类似`“a \ nb \ nc \ nd \ n”的输入,您可以让该循环输出多个"Please enter an integer only : "消息。

所以,你应该检查scanf是否遇到过流或其他一些读取错误的一端从输入转换任何事情之前,在这种情况下中止:

int reads; 
while(((reads = scanf("%d%c", &num, &a)) != 2 && reads != EOF) || a != '\n') 
{ 
    printf("Please enter an integer only : "); 
    // read at least one character until the next newline 
    do { 
     reads = scanf("%c", &a); 
    }while(reads != EOF && a != '\n'); 
} 
+0

我想了解你在说什么。因此,如果输入是qwe \ n,并且%d%c是必需的,那么您能告诉我scanf究竟做了什么吗?我曾经相信它会从输入中读取q,确定它不是整数,然后对于%c,将w分配给(变量)。然后在inner while循环中,它将读取字符直到\ n。 – Sahil

+0

输入'qwe \ n','scanf(“%d&c”,#num&a)'将无法从流中解析出int,因此不会在'num'或'a'中存储任何内容,返回0,并在输入流中保留'qwe \ n'。如果转换失败,则不会尝试进行后续转换,也不会使用失败点(含)以上的输入。 –

+0

只要流是好的,那也应该工作。 –

1

这是一个错误的做法。您可以使用fgets()来读取输入,然后解析整个ASCII范围的字符串。

fgets(s, 1024, stdin) 

for (i=0; s[i] ! = '\0';i++) { 
if(s[i] <'0' && s[i] >'9') 
    // not an integer<br> 

您也可以使用标准的功能,如isalnumisalpha

+0

我已经提到过,我不想将字符串输入存储为 – Sahil

1

它的工作原理......

while(scanf("%d%c",&num,&a) != 2 || a != '\n') 
{ 
    printf("Please enter an integer only : "); 
    do{ 
     scanf("%c",&a); 
    }while(a != '\n'); 
} 
+0

雅,你说的对,它是有效的。但我不明白如何。例如,如果我输入a并按回车,那么我的输入是\ n,并且%d会消耗a,\ n将被while循环中的第一个%c消耗。那么while循环中的scanf()会做什么? – Sahil

+0

但我不知道为什么...... – TopCaver

+0

感谢您的尝试。这比我的第一个解决方案好,但问题仍然是一样的。我不明白它是如何工作的。 – Sahil