检查用户输入的值是否为数字的基本/手动方式

时间:2012-08-27 18:33:28

标签: c

我已经搜索过这些论坛,但我仍然遇到了麻烦。我对C的理解仍然很基础。我正在创建一个小程序,它接受用户输入的3个数值,然后计算最高值。我钉了那个。

我现在想确保用户只输入整数值。我设法让prog继续提示用户重新输入值,直到它在指定的数值范围内(例如,1到1000之间的任何数字,包括一块蛋糕),但这还不够好。我使用3个while循环来测试每个值,但这只有在输入类型为整数时才有效。

诀窍是我无法使用内置函数。它需要是手动的(抱歉,选择不好的单词)我试图使用char变量和x = getchar();获取ASCII值并在条件下测试它,但我不能让它在循环中工作。 (while / do-while)

我也尝试过使用“for循环”和数组变量,但又一次努力让它继续提示用户。

我还尝试测试scanf返回的值,看看它的整数,但我的正确C语法知识水平是否为:noob。我的循环不循环或无限循环。

以下是一些示例代码:

int x, y, z =0;

printf("Enter the first number:\n");
scanf("d", &x);
while (condition) /* Here is where I need to determine that the entered val is false */
{
    printf("Wrong input. Re-enter a valid value.\n");
    x =0;
    scanf("%d", &x); /*user re-prompted */
}

我知道我必须使用ASCII和循环,但我无法达到它。此外,输入的值将发送到函数进行比较,然后返回。

有人可以给我一些建议和一些提示吗?

非常感谢

4 个答案:

答案 0 :(得分:0)

您必须使用fgetsstrtol

之类的内容
long someValue;

char *bufEnd = NULL;
char buf[128]; // max line size

do {
    printf("enter a value: ");
    fgets(buf, 128, stdin);
    someValue = strtol(buf, &bufEnd, 10); // base 10
} while (bufEnd == buf || *bufEnd != '\n');

printf("got value: %li", someValue);

我们在这里做的是通过传入strtol,我们正在利用bufEnd告诉我们停止解析的位置的能力。

然后,我们确保bufEnd没有指向buf的开头(在这种情况下,它不是以数字开头),并且还要检查以确保bufEnd指向\n或该行的结尾(确保用户未输入123abc之类的内容,strtol将其解释为123 })。但是,您可能希望首先修剪buf个空白字符。

答案 1 :(得分:0)

你使用“scanf()”绝对走在正确的轨道上。只需检查返回值。如果没有得到预期的#/值,则输入无效:

char found = FALSE;
int ival;
double x;

while (!found)
{
    printf("Please enter a valid integer: ");
    if (scanf("%d", &ival) !=1) {
      printf ("Invalid!  Please re-enter!\n");
      continue;
    }
    printf("Please enter a valid floating point number: ");
    if (scanf("%lf", &x) !=1) {
      printf ("Invalid!  Please re-enter!\n");
      continue;
    }
    found = TRUE;
}

答案 2 :(得分:0)

这是我的解决方案。它可以安全地防止缓冲区溢出并且直截了当。

#include <stdio.h>
#define LEN 10

int main() {
    int a;
    char str[LEN];
    fgets( str, LEN, stdin );
    while ( !sscanf( str, "%d", &a ) )
        fgets( str, 10, stdin );
    printf("Num is : %d\n", a);
    return 0;
}

答案 3 :(得分:0)

#include <stdio.h>
#include <limits.h>
#include <ctype.h>

int getInteger(int* err){
    int ch;
    int n;//int32
    int takeNum, sign;
    long long int wk;//long long int as int64

    wk=0LL;
    *err = 0;
    takeNum = 0;//flag
    sign = 1;//minus:-1, other:1
/*  //skip space character
    while(EOF!=(ch=getchar()) && (ch == ' ' || ch == '\t' || ch == '\n'));
    ungetc(ch, stdin);
*/
    while(EOF!=(ch=getchar())){
        if(ch == '-'){
            if(takeNum != 0){//in input number
                *err = 1;
                break;
            }
            if(sign == -1){//already sign
                *err = 2;
                break;
            }
            sign = -1;
            continue;
        }
        if(ch >= '0' && ch <= '9'){//isdigit(ch) in ctype.h
            if(takeNum == 0)
                takeNum = 1;
            wk = wk * 10 + (ch - '0')*sign;
            if(INT_MAX < wk || INT_MIN > wk){//overflow
                *err = 3;
                break;
            }
            continue;
        }
        if(ch != '\n'){//input other [-0-9]
            *err = 4;
        }
        break;
    }
    if(takeNum == 0){//not input number
        *err = 5;
    } else {
        n=wk;
    }
    while(ch != '\n' && EOF!=(ch=getchar()));//skip to newline
    return n;
}

int getValue(const char* redoprompt, int low, int high){
    int num, err=0;

    while(1){
        num = getInteger(&err);
        if(err || low > num || high < num)
            printf("%s", redoprompt);
        else
            break;
    }
    return num;
}

#define max(x,y) ((x)>(y))? (x) : (y)

int main(){
    const char *error_message = "Wrong input. Re-enter a valid value.\n";
    int x, y, z, max;

    x = getValue(error_message, 1, 1000);
    y = getValue(error_message, 1, 1000);
    z = getValue(error_message, 1, 1000);
    max = max(max(x,y), z);
    printf("max:%d\n", max);
    return 0;
}