C中while/if循环的逻辑问题

C中while/if循环的逻辑问题,c,if-statement,logic,do-while,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);

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

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
。这正是我想要做的,但我只希望它在用户输入时打印一次“好的,这是一个好数字”。示例:如果有人要输入:
12345
我希望它返回:
“好的。这是一个很好的数字。”
对这5个字符输入一次,而不是每个字符输入一次。希望这是有意义的,已经尝试了一段时间,所以任何事情都会有所帮助

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

  • 无需检查输入的结尾即可无限循环:
当用户输入几个数字时,您说您想判断这是否是一个好的数字,但您一次只读取一个字符,并且不定义数字的结束方式。 虽然您确实指定以回车结束,但您并没有这样设计算法,您从未检查
\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;
}
但我确实退出了无限循环,以便能够检查结果

注意:在本例中,我没有检查溢出。 注意1:我一直使用它来接近您的代码,但是如果您一次只想读取一个字符,那么最好使用更简单、更快的方法。 注意:您还可以通过使用以下更多功能来简化代码:


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

为什么要使用全局变量
输入
imax
右值
温度
?或者为什么在发布代码之前要删除变量定义?必须进行错误检查
scanf()
;否则,你永远不会知道你什么时候碰到EOF。似乎您可以键入
123@
123.
等,数字是可以的,但如果键入
123a
则不行。您真正想要终止数字的字符是什么?您是对的,
scanf()
不(一定)保护自身免受溢出。你应该推回数字结尾的字符吗?@JonathanLeffler很抱歉,我将添加变量定义(尽管我不认为它们都是必要的)。这只是一段“快速”的代码,所以我并不真正担心任何溢出或类似的问题。我也希望print语句的行为符合我的要求。您的验证
if(rValue>imax)
可能应该在
if(isdigit(input))
代码块中;如果您没有尝试设置
rValue
,那么测试溢出就没有意义了。它也会影响你的逻辑,这是你的主要问题。当你找到一个好的数字时,你应该退出
do{…}while(1)循环。@JonathanLeffler我该如何退出
边做边循环
,同时仍然逐个检查每个
字符
?你已经得到了一个相当不错的答案;我的在某些方面会很相似,但也会有所不同。总的来说,我更喜欢另一种解决方案,尽管我的解决方案至少在某些方面更接近您的原始代码。出于好奇,在用户输入正确的int之前,您将如何循环此解决方案?基本上:
while(getInputData()!=1){printf(“这不是一个整数,请重试。\n”);}printf(“好孩子,这是一个整数。”);…事实上这很明显,为什么要问这个问题?
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);
}