2016-12-03 350 views
-1

我需要检查输入是否为数字。我的代码看起来是这样的:检查输入是否为数字C

int input; 

while (scanf(" %s %d", string, &input) != EOF) { 

if (isNotANumber(input)) { 
    printf("Not a number"); } 

doSomethingElse(input, string); 
} 

编辑:我需要接受输入和调用函数doSomethingElse(输入),直到用户输入EOF。 isNotANumber是一个模拟功能,我没有那个功能,我在问我怎么写它。

编辑2:变量字符串需要是一个字符串,变量输入需要是一个整数。

编辑3:我试着分开我的代码到这一点:

while (scanf(" %s", string) != EOF) { 
    if (scanf("%d",&input) != 1) { 
    printf("not a number"); 
} 
doSomething(); 
} 

但还是老样子并不像“4A”输入工作。

+1

我认为'isNotANumber(输入)'不能在循环检查'input' 。 – BLUEPIXY

+0

由于'input'被定义为'int',所以它的值将永远是一个整数,至少与'scanf()'没有失败一样长。 – alk

+0

如果您不知道输入是数字,则不能使用scanf。 (或者,你可以使用scanf,但是如果scanf没有读取输入,因为它不是一个数字,那么你将不得不以其他方式读取它,所以scanf毫无意义。)需要以其他方式输入数据。尝试'fread',然后使用'strtol'检查它是否是一个整数。顺便说一句,你的意思是“数字”,还是“整数”?准确。 –

回答

1

例如,你可以改变它如下。

#include <stdio.h> 

#define doSomethingElse(input) do{ printf("your input is %d\n", input); }while(0) 

int main(void){ 
    int input; 
    int status; 

    while ((status = scanf("%d", &input)) != EOF) { 
     if (status == 0) { 
      printf("Not a number\n"); 
      while(getchar() != '\n'); //clear input 
     } 
     else { 
      doSomethingElse(input); 
     } 
    } 
} 

但是,这不能检查输入如123.456。 (接受123
所以,建议用fgets输入并用strtol查询。


前面已经指出的那样,像scanf(" %s %d", string, &input)数量后不能检查输入。

所以,为了方便,请检查后向输入。

char string[32], ch; 
int input; 
int status; 


while ((status = scanf("%31s %d%c", string, &input, &ch)) != EOF) { 
    if (status == 3 && ch == '\n') { 
     doSomethingElse(input); 
    } 
    else { 
     printf("Not a number\n"); 
     while(getchar() != '\n'); //clear input 
    } 
} 

使用 fgetsstrtol

实施例(mystrtoi了重组chux的answer。感谢)

#include <stdio.h> 
#include <errno.h> 
#include <limits.h> 
#include <stdlib.h> 

#define doSomethingElse(input) do{ printf("your input is %d\n", input); }while(0) 

int mystrtoi(const char *str, int *err) { 
    char *endptr; 
    *err = errno = 0; 
    long l = strtol(str, &endptr, 0); 
    if (errno == ERANGE || *endptr != '\0' || str == endptr) { 
     *err = 1; 
    } 
    // Only needed if sizeof(int) < sizeof(long) 
    if (l < INT_MIN || l > INT_MAX) { 
     *err = 1; 
    } 
    return (int) l; 
} 


int main(void){ 
    char line[128]; 
    char string1[32], string2[128]; 
    int num, err; 

    while (fgets(line, sizeof line, stdin)){ 
//  if(2 != sscanf(line, "%31s %31s", string1, string2)){// or use strtok to split 
     if(2 != sscanf(line, "%31s %127[^\n]", string1, string2)){ 
      printf("invalid input\n"); 
      continue; 
     } 
     num = mystrtoi(string2, &err); 
     if(err) { 
      printf("Not a number\n"); 
     } 
     else { 
      doSomethingElse(num); 
     } 
    } 
} 
+0

谢谢。我不得不编辑代码,我现在如何检查我的输入? – Kate

+0

@Kate情况变化不大。如果'status == 1'输入失败。 – BLUEPIXY

+0

它仍然接受输入为“字符串4a”,也应该被视为“不是数字”。我该如何解决这个问题? – Kate

0
​​

scanf代码有两个问题:

  • scanf返回成功读取的项目,而不是EOF数量。在这里,您要检查是否scanf已成功读取一个整数input
  • scanf预期的变量

你应该重新写行地址:

while (scanf("%d", &input) == 1) 
+0

我编辑了我的帖子。你能再看一遍吗? – Kate

+2

如果你的'scanf'成功了,那么'input'已经是一个数字 – artm