2014-04-07 175 views
2

我需要制作一个函数,该函数从用户那里获取输入并确保它是一个整数并且不包含任何字符。检查输入是否是整数

我写了这个代码,它完美地适用于整数和单个字符。但是,如果我输入dfd即终止多个字符输入。下面是我的代码用gcc在Linux编译:

#include <ctype.h> 

int getint() 
{ 
    int input = 0; 
    int a; 
    int b, i = 0; 
    while((a = getchar()) != '\n') 
    { 
     if (a<'0'||a>'9') 
     { 
      printf("\nError in input!Please try entering a whole number again:"); 
      input=0; 
      fflush(stdin); 
      return getint(); 
     } 
     b = a - '0'; 
     input = ((input*10) + b); 
     i++; 
    } 
    return input; 
} 
+0

朋友学习[缩进](http://www.cs.arizona.edu/~mccann/indent_c.html)。 –

+0

你为什么要对stdin执行fflush?它是一个输出函数(除非我要学习一些非常模糊的东西)。你是不是指fpurge? – DrC

+2

'fflush(stdin)'的行为不是由C标准定义的。它由一些实现和POSIX定义,但在这里没有用。你可能想要做的是读取和放弃输入字符,直到你看到'\ n''或'EOF'。 –

回答

1

问题可能是调用fflush(stdin)未定义。 fflush用于刷新输出流,而不是输入流。尝试用另一种方式替换它以清除剩余的输入缓冲区,如while (getchar() != '\n');,然后查看是否可以解决问题。 (你也许应该做一些更强大的工作,比如捕获EOF,这样你就不会陷入无限循环)

+0

谢谢..工作就像一个魅力!这是清除输入缓冲区的最简单方法。以防万一有其他选择吗? –

+0

请提出问题 –

1

改变fflushfpurge造成你的程序,开始为我工作。

+0

'fpurge'是非标准且不可移植的。引用其手册页:“通常放弃输入缓冲区是一个错误。” –

+0

fpurge不包含在stdio.h中我在哪里可以找到它? –

2

在输入流上调用fflush会调用未定义的行为。即使你的实现为输入流定义它,它也不是可移植的。没有标准的方法来刷新输入流。因此,fflush(stdin);是不正确的。你应该阅读这些字符并丢弃它们,直到包含stdin缓冲区中的换行符。我建议对你的功能进行如下修改。

int getint(void) { 
    int input = 0; 
    int a; 

    while((a = getchar()) != '\n') { 
     if (a < '0' || a > '9') { 
      printf("Error in input!Please try entering a whole number again:\n"); 
      input = 0; 

      // read and discard characters in the stdin buffer up till 
      // and including the newline 
      while((a = getchar()) != '\n'); // the null statement 
      return getint(); // recursive call 
     } 
     input = (input * 10) + (a - '0'); 
    } 
    return input; 
} 

另外,请仔细阅读本C常见问题 - If fflush won't work, what can I use to flush input?

+0

有道理,请提出问题! –