为什么我的 C 函数返回不正确的 int?

Why is my C function returning the incorrect int?

我正在制作一个简单的程序,要求用户提供最小值和最大值(32 到 127 之间,包括在内),但出于某种原因,每次我尝试存储最小值时,它都会被另一个值替换。

代码如下:

#include <stdlib.h>
#include <stdio.h>
#define lenLimit 256

char text[lenLimit];

int enterNumber(int loLimit, int hiLimit) {
    printf("Please enter an integer between 32 and 127: ");
    fgets(text, lenLimit, stdin);
    int enter = atoi(text);
    int exit;
    if (enter < 32 || enter > 127) {
        printf("Min %i OUT OF range\n", enter);
        enterNumber(enter, hiLimit);
    }
    if (enter >= 32 && enter <= 127 && hiLimit > 127) {
        exit = atoi(text);
        printf("Min %i IN range\n", exit);
    }
    if (loLimit >= 32 && loLimit <= 127 && hiLimit <= 127 && enter >= loLimit) {
        exit = hiLimit;
        printf("Max %i IN range\n", exit);
    }
    printf("num returned: %i\n", exit); //prints twice, why?
    return exit;
}

void printTable(int loLimit, int hiLimit) {
    for (int i = loLimit; i <= hiLimit; i++) {
        printf("ASCII character%3d is %c.\n", i, i);
    }
}

int main(int argc, char* argv[]) {
    int min = enterNumber(31,128);
    printf("Min: %i\n", min);
    int max = enterNumber(min, 128);
    printf("Max: %i\n", max);
    printTable(min, max);
    return(EXIT_SUCCESS);
}

结果如下:

Please enter an integer between 32 and 127: 31
Min 31 OUT OF range
Please enter an integer between 32 and 127: 33
Min 33 IN range
num returned: 33
num returned: 1600375832
Min: 1600375832
Please enter an integer between 32 and 127: 45
Min 45 IN range
num returned: 45
Max: 45

您在其中一种情况下从自身调用 enterNumber,您正在丢弃其结果。然后你输出一个单位化的值 exit。 (使用未初始化的变量在 C 中是未定义的行为)。

避免递归这样的事情,而是使用循环。

首先调用以下函数。

int min = enterNumber(31,128);

并且,在 enterNumber() 中再次调用了 enterNumber()。 但是这段代码没有得到 enterNumber() 的结果。 因此,显示未初始化的值 1600375832。

您没有将 'enter' 初始化为任何东西,它仅在 3 个 if 条件中的 2 个中分配。

此外,您正在递归调用此函数(调用自身),但这样做时您没有返回。也许这是故意的,但你在 printf 之后的评论让我觉得不是。此递归是您看到 2 个打印件的原因。

试试这个...

int enterNumber(int loLimit, int hiLimit) {
    printf("Please enter an integer between 32 and 127: ");
    fgets(text, lenLimit, stdin);
    int enter = atoi(text);
    int exit = enter;
    if (enter < 32 || enter > 127) {
        printf("Min %i OUT OF range\n", enter);
        return enterNumber(enter, hiLimit);
    }
    if (enter >= 32 && enter <= 127 && hiLimit > 127) {
        printf("Min %i IN range\n", exit);
    }
    if (loLimit >= 32 && loLimit <= 127 && hiLimit <= 127 && enter >= loLimit) {
        exit = hiLimit;
        printf("Max %i IN range\n", exit);
    }
    printf("num returned: %i\n", exit); //prints twice, why?
    return exit;
}