ОСНОВНАЯ программа, управляемая из меню, повторяется дважды после успешного завершения первого задания - PullRequest
0 голосов
/ 03 мая 2010

Я использую Plato3 для написания программ на Си.

Я создаю программу на основе меню, но хочу проверить основную концепцию, как заставить ее работать

#include<stdio.h>
#include<ctype.h>
int function1();

main(){
  char s;
 do{
   puts("\n choose the following");
   puts("(P)rint\n");
    puts("(Q)uit\n");
   scanf("%c",&s);
   s=toupper(s);
   switch (s){
     case 'P' : function1();
        break;
        case 'Q' : return -1;
     break;
    }
 }while (function1()==0);  
}

int function1(){
   printf("Hello World");
   return 0;
 }

Проблема в том, что когда function1 () возвращает значение 0, выводится вся программа ... почему?

Пример: запуск программы дает следующее:

Hello WorldHellow World
 choose the following
(P)rint

(Q)uit

Hello World
 choose the following
(P)rint

(Q)uit

- Есть идеи, почему?

Пожалуйста, помогите, спасибо !!!!

1 Ответ

3 голосов
/ 03 мая 2010

Если вы выберете P, вы вызовете function1 в этом операторе case.Затем, поскольку вы не вернули -1 из main (единственный способ, которым ваш цикл может выйти), вы затем снова вызовете function1 из условного цикла.

Причина, по которой он переключается между двойным HelloWorld и одиночным, заключается в том, что пробельные символы не совпадают с 'P'.Вместо этого они были просто проигнорированы.Чтобы справиться с этим, вы, вероятно, захотите удалить пробелы, поэтому мы добавляем \ n к scanf.Я также добавил случай по умолчанию для неправильного ввода, который в настоящее время также выходит из цикла.Таким образом, вы получите что-то вроде:

main(){
    char s;
    int status = 0;
    do{
        puts("\n choose the following");
        puts("(P)rint\n");
        puts("(Q)uit\n");
        scanf("\n%c",&s);
        s=toupper(s);
        switch (s){
        case 'P' : status = function1();
            break;
        case 'Q' : status = -1;
            break;
        default : status = -1;
        }
    } while (status == 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...