2015-06-26 5 views
1

Я делаю простую программу, которая запрашивает у пользователя минимальные и максимальные значения (от 32 до 127 включительно), но по какой-то причине каждый раз, когда я пытаюсь сохранить минимальное значение, оно заменяется другим значением.Почему моя функция C возвращает неверный int?

Вот код:

#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 
+1

У вас есть рекурсивный вызов: 'enterNumber (ввод, hiLimit)'. –

+0

Этот цикл разрешен только в C11 и C99: 'for (int i = loLimit; i <= hiLimit; i ++)' – moffeltje

+1

@moffeltje OP явно не использует стандарты, совместимые с C89, из-за многих объявлений переменных после операторов кода в том же блоке , '//' комментарии и т. д. –

ответ

3

Вы не инициализируете «вводить» что-либо, и оно назначается только в 2 из 3 ваших условий if.

Кроме того, вы вызываете эту функцию рекурсивно (вызывая себя), но при этом вы не возвращаетесь. Возможно, это намеренно, но ваш комментарий после 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; 
} 
6

Вы вызываете enterNumber из себя в одном из условий, в результате чего вы отделяемого. Затем вы получаете унифицированное значение exit. (Использование неинициализированной переменной - неопределенное поведение в C).

Избегайте рекурсии для подобных вещей, используйте вместо этого цикл.

1

Ниже функция сначала называется.

int min = enterNumber(31,128); 

И, enterNumber() снова вызывается в enterNumber(). Но этот код не получает результат enterNumber(). Таким образом, отображается неинициализированное значение 1600375832.