2017-04-18 41 views
0

我一直在研究一个需要整数输入的程序,但是每次意外地输入一个非整数时,scanf函数停止工作或陷入循环。使用scanf只能输入整数?

这是什么,我试图做一个例子:

int n; 
    printf("please enter 0 or 1\n"); 
top: 
    scanf("%i",&n); 
    if(n == 0) 
    { 
     printf("you entered 0!\n"); 
    } 
    if(n == 1) 
    { 
     printf("you entered 1!\n"); 
    } 
    if(n != 0 && n != 1) 
    { 
     printf("please enter either 0 or 1."); 
     goto top; 
    } 

第三,如果是,如果你没有输入正确的号码发送给您回顶,但这并不信件工作和其他角色。 如果给出非整数输入,您如何将它发送回顶端?

+1

道奇它用'fgets'进入和应用'sscanf'并检查它的返回值(研究手册页:scanf家族的函数返回值是什么?)。如果你没有得到你想要的,转储输入字符串,并得到另一个。 –

+1

“如果给出非整数输入,你怎么能把它发送回顶端?” - >读取非整数并首先将其扔掉。 – chux

+0

您应该检查'scanf()'的返回值以识别何时发生错误,例如输入不是数字。当发生这种匹配失败时,您必须从标准输入中读取至少一个字符 - scanf()目前正在窒息 - 否则它将保持在那里以在下一次尝试中造成麻烦。 –

回答

0

这可以通过以下替换scanf("%i",&n);呼叫解决:

char buffer[256]; 
char *s = fgets(buffer, 256, stdin); 

if (s != buffer) 
{ 
    // Some error occurred 
    goto top; 
} 

int error = sscanf(buffer, "%i", &n); 

if (error == 0) 
{ 
    // The string read is not a number! 
    printf("please enter either 0 or 1."); 
    goto top; 
} 
0

试试这个

#include <stdio.h> 

int main(void){ 
    int n; 
    printf("please enter 0 or 1\n"); 

    for(;;){ 
     int status; 
     char ch; 
     status = scanf("%i%c", &n, &ch);//check return value of scanf, ch : for check rest input 
     if(status == EOF){ 
      printf("Bye!!\n", n); 
      return 0; 
     } else if(status == 2 && ch == '\n'){ 
      if(n == 0 || n == 1){ 
       printf("you entered %i!\n", n); 
       break; 
      } 
     } else { 
      while(getchar() != '\n');//clear input 
     } 
     printf("please enter either 0 or 1.\n"); 
    } 
    return 0; 
}