Программа заканчивается внезапно, с корпусом переключателя внутри, пока l oop in C - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть эта программа шоу, которая позволяет мне отображать меню с 3 вариантами выбора. Если вы выберете что-нибудь, кроме exit (0), тогда программа продолжит работу до l oop.

Однако, когда я пытаюсь вызвать функцию изнутри оператора switch, после завершения функции l oop существует полностью Я хочу go вернуться в меню и продолжить, пока не выберу выход.

Программа работает без вызова функции. Это также работает, если я выбираю 2, треугольник, затем оно остается в l oop.

Почему это происходит, и как я могу это исправить,

большое спасибо.

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

int rows;

void xmasTree(void)
{ 
 printf("Enter Rows:\n>");
 scanf("%d",&rows);
}

int main (int argc, char ** argv)
{
    int flag = 1;
    while (flag)
    {
        //Print menu
        printf("1: Create xmas tree\n");
        printf("2: Create triangle\n");
        printf("0: exit\n");
        printf("Enter choice :");
        //read input
        char buffer[10];
        fgets(buffer, 10, stdin);
        //convert to number
        int number = atoi (buffer);

        //work on input
        switch (number)
        {
            case 1:
                printf("Building your xmas tree\n");
                xmasTree();
                break;
            case 2:
                printf("creating your triangle\n");
                break;
            case 0:
                printf("Exiting...\n");
                flag = 0;
                break;
            default:
                printf("INVAID INPUT\n");
                break;
        }
    }   
    return 0;
}   

Ответы [ 2 ]

4 голосов
/ 03 февраля 2020

Проблема в том, что здесь

scanf("%d",&rows);

вы читаете число из stdin, но вы оставляете завершающий символ новой строки внутри потока!

Тогда в следующей l oop итерации

fgets(buffer, 10, stdin);

читает (пустую) строку и

int number = atoi (buffer);

устанавливает number в 0, вызывая выход вашей программы.

Одним из возможных исправлений было бы чтение в rows с fgets() и atoi(), как вы делаете это с number.

1 голос
/ 03 февраля 2020

Проблема заключается в этом вызове в функции xmasTree

scanf("%d",&rows);

После этого в буфере сохраняется символ новой строки '\n'. Поэтому следующий вызов функции fgets читает пустую строку. Вы должны удалить этот символ новой строки, например,

scanf("%d",&rows);
scanf( "%*[^\n]" );
scanf( "%*c" );
...