Возвращение -1 к определенной пользователем функции приводит к завершению программы с кодом выхода 0 - PullRequest
0 голосов
/ 30 сентября 2018

В этой факториальной программе при вводе любого нечислового или отрицательного числа программа должна запросить рентацию значения, но на выходе программа завершается.

Это потому, что я возвращаю -1 в display() функцию?Если это так, то обязательно ли возвращать значение переменной (или другой функции) в функцию, если функция должна возвращать значение?

#include <stdio.h>

int display();
void fact_fun(int num_fact);

int main() {
    int num = 0;
    char next;

    next = display();

    if (next == -1) { //WHEN ANY CHARACTER OR NEGATIVE NUMBER IS ENTERED IT WILL ASK TO RENTER
        printf("\nOnly positive number is allowed");
        display();
    }

    while (next >= 0) { //WHEN NEGATIVE NUMBER IS ENTERED IT WILL END THE LOOP
        num = next;
        fact_fun(num);
        next = display();
    }
    return 0;
}

int display() {
    char inp[10] = { 0 };
    int input;
    int index = 0;
    printf("\nEnter number to find factorial or press ENTER KEY to exit: ");

    while (((input = getchar()) != EOF) & (index < 10)) {
        if ((input >= '0') && (input <= '9')) {
            inp[index++] = input;
        } else
        if (input == '\n')
            break;
        else
            return -1;
    }
    input = atoi(inp);

    return input;
}

void fact_fun(int num_fact) {
    int fact = 1;
    if (num_fact == 0) {
        printf("\nFactorial of %d is 1", num_fact);
        return;
    } else {
        for (int i = 1; i <= num_fact; i++) {
            fact = fact * i;
        }
        printf("\nFactorial of %d is %d", num_fact, fact);
    }
}

Также, когда я нажимаю клавишу ВВОД, я получаю вывод, как показано ниже:

Factorial of %d is 1
Enter number to find factorial or press ENTER KEY to exit:

И при вводе \n программа завершается.Насколько я понимаю, это должно относиться к клавише Enter и \n то же самое.Если нет, то в чем разница и как проверить значение клавиши ENTER KEY?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Пользовательский ввод по умолчанию буферизован.Для вашей цели гораздо проще считывать ввод по одной строке за раз от пользователя, анализировать его, чтобы утверждать правильность ввода и вычислять факториал только для правильного ввода.

Обратите также внимание, что вы можете упростить вычисления какспециальный случай для 0 избыточен с кодом для общего случая.Вам также следует проверить возможное арифметическое переполнение, поскольку вычисление может легко превысить диапазон типа int и привести к неопределенному поведению.

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int display();
void fact_fun(int num_fact);

int main() {
    int num;
    while ((num = display()) >= 0) {
        fact_fun(num);
    }
    return 0;
}

int display() {
    char buf[256];
    char *p;
    long value;

    for (;;) {
        printf("Enter number to find factorial or press ENTER KEY to exit: ");
        if (fgets(buf, sizeof buf, stdin) == NULL || *buf == '\n')
            return -1;
        errno = 0;
        value = strtol(buf, &p, 0);
        if (p == buf) {
            printf("Invalid input: not a number\n");
        } else {
        if (value < 0) {
            printf("Invalid input: negative values not allowed\n");
        } else
        if (errno != 0 || value > INT_MAX) {
            printf("Invalid input: value too large for type int\n");
        } else {
            return (int)value;
        }
    }
}

void fact_fun(int num_fact) {
    int fact = 1;
    for (int i = 1; i <= num_fact; i++) {
        if (fact > INT_MAX / i) {
            printf("Invalid input: arithmetic overflow\n");
            return;
        }
        fact = fact * i;
    }
    printf("Factorial of %d is %d\n", num_fact, fact);
}
0 голосов
/ 30 сентября 2018

Вот ваш код с некоторыми исправлениями.Возникли две проблемы.

Во-первых, вы должны закончить чтение ввода, пока не достигнете конца строки или EOF.

Во-вторых, вам нужно два кода ошибки, одиндля неверного ввода, и второй для отсутствия ввода.(Ваш комментарий в коде означает, что вы хотите выйти без ввода).

#include <stdio.h>
#include <stdlib.h>

int display();
void fact_fun(int num_fact);

int main() {
  //int num = 0;
    char next;

    while( 1 ) {

      next = display();
      if (next == -2) {
    break;
      }

      if (next == -1) {
    //WHEN ANY CHARACTER OR NEGATIVE NUMBER IS ENTERED IT WILL ASK TO RENTER
        printf("\nOnly positive number is allowed");
      }

      else {

        fact_fun(next);
      }
    }
    return 0;
}

int display() {
    char inp[10] = { 0 };
    char c;
    int input = 0;
    int index = 0;
    printf("\nEnter number to find factorial or press ENTER KEY to exit: ");

    while ( ((c = getchar()) != EOF) && (c != '\n') && (index < 10)) {
      if ( (c >= '0') && (c <= '9') ) {
    inp[index++] = c;
      } else {
    input = -1;
    break;
      }
    }

    // Finish inputting the line
    while ( (c != EOF) && (c != '\n') ) {
      c = getchar();
    }

    if ( !input ) {
      if ( index )
    input = atoi(inp);
      else
    input = -2;
    }

    return input;
}

void fact_fun(int num_fact) {
    int fact = 1;
    if (num_fact == 0) {
        printf("\nFactorial of %d is 1", num_fact);
        return;
    } else {
        for (int i = 1; i <= num_fact; i++) {
            fact = fact * i;
        }
        printf("\nFactorial of %d is %d", num_fact, fact);
    }
}
0 голосов
/ 30 сентября 2018

В этой факториальной программе при вводе любого нецифрового или отрицательного числа программа должна попросить снять значение

Цикл while в вашей функции main() циклично выполняет толькозапрашивать новые номера, пока input() не вернет отрицательное число.Вы даже задокументировали это:

while(next>=0) //WHEN NEGATIVE NUMBER IS ENTERED IT WILL END THE LOOP
...

Когда вы делаете return -1 в input(), функция возвращает -1, что установит next в -1 и завершит цикл.Вскоре после этого программа существует.

Нет ничего плохого в том, чтобы использовать оператор return для возврата -1 из определенной пользователем функции.Делать подобные вещи вполне нормально и обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...