检查输入是否为数字C
问题描述:
我需要检查输入是否为数字。我的代码看起来是这样的:检查输入是否为数字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”输入工作。
答
使用
例如,你可以改变它如下。
#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
}
}
使用
fgets
和
strtol
实施例(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);
}
}
}
我认为'isNotANumber(输入)'不能在循环检查'input' 。 – BLUEPIXY
由于'input'被定义为'int',所以它的值将永远是一个整数,至少与'scanf()'没有失败一样长。 – alk
如果您不知道输入是数字,则不能使用scanf。 (或者,你可以使用scanf,但是如果scanf没有读取输入,因为它不是一个数字,那么你将不得不以其他方式读取它,所以scanf毫无意义。)需要以其他方式输入数据。尝试'fread',然后使用'strtol'检查它是否是一个整数。顺便说一句,你的意思是“数字”,还是“整数”?准确。 –