2

我已经在这些论坛内外搜索过,但仍然遇到问题。我对C的理解还是很基础的。我正在创建一个小程序,它采用用户输入的 3 个数值,然后计算最高值。我明白了。

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

诀窍是我不能使用内置函数。它需要手动(抱歉,选词不当)我尝试使用 char 变量和 x = getchar(); 获取 ASCII 值并在某个条件下对其进行测试,但我无法让它在循环中工作。(当/做时)

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

我还尝试测试 scanf 返回的值以查看它是否为整数,但我对正确 C 语法的知识水平是 level: 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

4 回答 4

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;
}
于 2012-08-28T16:23:30.760 回答
0

您将不得不使用类似的东西fgets,并且strtol

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.

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

于 2012-08-27T18:41:44.953 回答
0

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

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;
}
于 2012-08-27T18:48:06.463 回答
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;
}
于 2012-08-27T18:55:56.770 回答