麻烦在C中找出while / if循环的逻辑

时间:2014-01-24 21:29:02

标签: c if-statement logic do-while

我有一些代码,我遇到问题的功能是:

unsigned int getInputData() {

    printf("Please input a positive integer number terminated with a carriage return.\n");

    do{ 
        scanf("%c", &input);

        if(isdigit(input))  {
            temp = charToInt(input);
            rValue = mergeInt(rValue, temp);
        }
        if(rValue >= imax)  {
            rValue = 0;
            printf("ERROR: That is too large of an integer. Please try again. \n");
        }
        else if(isalpha(input)){
            rValue = 0;
            printf("This is not a integer. Please try again. \n");
        }
        else{
            printf("OK. This is a good number. \n");
        }
    } while(1);
}

我正在逐个扫描每个char,并将其合并为int。这正是我想要做的但是我只希望它在用户输入时打印"OK. This is a good number."一次。示例:如果有人要输入:12345我希望它返回:{{ 1}}一次为5个char而不是每个。希望这是有道理的,已经有一段时间了,所以一切都会有所帮助。

1 个答案:

答案 0 :(得分:2)

您的代码背后存在巨大的逻辑问题:

  • 无限循环而不检查输入结束:

你说你想知道当用户输入几个数字时这是一个好的数字,但是你一次只读一个字符,而你没有定义数字的结束方式。 虽然您指定以回车符结束,但您没有以这种方式设计算法,您从不检查\n字符。

  • 您可以为getInputData()函数定义返回值,但不会从该函数返回。
  • 您测试input是否为更新值的数字,但对于错误,只有当它是字母字符时才显示错误。

基本上,为了与编写算法的方式保持一致,这是另一个需要:

unsigned int getInputData() {
    char input;
    long value=0;

    do {
        scanf("%c", &input);

        if (isdigit(input))
            value = value*10+input+'0';
        else if (input == '\n')
            return 1;
        else
            return 0;

    } while(1);
}

int main() {
    printf("Please input a positive integer number terminated with a carriage return.\n");

    if (getInputData() == 1)
        printf("OK. This is a good number.\n");
    else
        printf("This is not a integer. Please try again. \n");

    return 0;
}

但是我从无限循环中退出以便能够检查结果。

N.B。:出于示例的目的,我没有检查溢出。 NB1 :我一直使用scanf()来接近您的代码,但如果您只想一次阅读一个字符,最好使用getchar()方式更简单,更快捷。 N.B.2 :您还可以使用scanf()的更多功能来简化代码:

unsigned int getInputData() {
    unsigned input;
    long value=0;
    int n;

    do {
        n = scanf("%u", &input);
        if (n == 0)
            return 0;
        else
            return 1;
    } while(1);
}

您甚至可以尝试使用GNU扩展名scanf("%a[0-9]")。有关详细信息,请参阅man scanf