为什么我的 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;
}
我正在制作一个简单的程序,要求用户提供最小值和最大值(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;
}