Невозможно войти на 2-ю страницу из меню после входа на предыдущую страницу - PullRequest
0 голосов
/ 19 апреля 2019

После входа на 1-ю или 2-ю страницу и возврата в меню я могу получить доступ только к 1-й странице, но не ко 2-й странице.

Я пытался поместить fflush (stdin) перед каждым вводом строки и символа.

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

int main()
{
    int password, i, j, timesVisited;
    char name[10][15]={"jay"}, address[10][40]={"singapore"}, ic[10][12], gender[10][6], contact[10][11]={"010"}, dataToEdit[8], patientToEdit[20], newData[40], menuOption, returnOption;


while(returnOption!=2){
    //Menu
    puts("Menara Clinic\n");
    puts("Press 1 to add patients' info");
    puts("Press 2 to edit patients' info");
    puts("Press 3 to access patients' history");
    puts("Press 4 to access inventory");
    puts("Press 5 to delete patients' info"); fflush(stdin);

    scanf("%c", &menuOption);
    //menuOption = getch();
    system("cls");

    //Page 1
    if(menuOption=='1')
    do
    {   for(i=0; i<1; i++)                                      //CHANGE i VALUE TO 10 AFTER TESTING
        {   printf("Enter name: "); fflush(stdin);
            scanf("%s", name[i]);
            printf("Enter gender: "); fflush(stdin);
            scanf("%s", gender[i]);
            printf("Enter address: "); fflush(stdin);
            scanf("%s", address[i]);
            printf("Enter contact no: "); fflush(stdin);
            scanf("%s", contact[i]);
            printf("Enter IC: "); fflush(stdin);
            scanf("%s", ic[i]);

            putchar('\n');
            puts("Press 0 to continue");
            puts("Press 1 to return to menu"); fflush(stdin);
            returnOption = getch();
        }
    }while(returnOption=='0');
    if(returnOption=='1')
    {   system("cls");
        continue;
    }

    //Page 2
    else if(menuOption=='2')
    {   do{
        i=0;
        printf("Enter name: "); fflush(stdin);
        scanf("%s", patientToEdit);
        for(i; i<1; i++)                                        //CHANGE i VALUE TO 10 AFTER TESTING
            {   if(strcmp(name[i], patientToEdit)==0)
                {   printf("Enter data to edit: "); fflush(stdin);
                    scanf("%s", dataToEdit);

                    if(strcmp(dataToEdit,"address")==0)
                    {   printf("Enter new address: "); fflush(stdin);
                        scanf("%s", newData);
                        strcpy(address[i], newData);    
                        printf("%s's new address is now %s\n", name[i], address[i]);                    
                    }
                    else if(strcmp(dataToEdit,"contact")==0)
                    {   printf("Enter new contact no: "); fflush(stdin);
                        scanf("%s", newData);
                        strcpy(contact[i], newData);
                        printf("%s's new contact no is now %s\n", name[i], contact[i]); 
                    }
                }
            }
            putchar('\n');
            puts("Press 0 to continue");
            puts("Press 1 to return to menu"); fflush(stdin);
            returnOption = getch();
        }while(returnOption=='0');
        if(returnOption=='1')
        {   system("cls");
            continue;
        }
    }
}
}

Программа должна позволять вам входить на любую из страниц меню даже после того, как вы уже заходили на страницу ранее.

1 Ответ

2 голосов
/ 19 апреля 2019

В

char name[10][15]={"jay"},..., menuOption, returnOption;

 while(returnOption!=2){

есть две ошибки:

  • вы пропустили инициализацию returnOption , поэтому поведение не определено, когдавы тестируете его в первый раз
  • , который вы хотите сравнить с '2', а не с 2, так что while(returnOption!='2') вместо while(returnOption!=2)

Также:

  • заменить scanf("%c", &menuOption); на scanf(" %c", &menuOption);, чтобы пропустить пробелы и переводы строк

  • заменить два returnOption = getch(); на scanf(" %c", &returnOption);

  • и удалите все fflush(stdin);, поскольку они ничего не делают, извлеките из его описания:

Для входных потоков, связанных с доступными для поиска файлами (например, дисковые файлы,но не каналы или терминалы ), fflush () отбрасывает любые буферизованные данные, которые были извлечены из базового файла, но не были использованы приложением.

Я также настоятельноРекомендуем защитить от переполнения массива, ограничив допустимое количество символов, считываемых scanf("%s..., например, имя запоминаетсяна 15 символов (включая нулевой символ), так что scanf("%14s", name[i]); и т. д.

Я не понимаю, почему

    putchar('\n');
    puts("Press 0 to continue");
    puts("Press 1 to return to menu");

    returnOption = getch();

находится внутри for(i=0; i<1; i++), пока вы делаетене проверяйте введенное значение, возможно, вы хотели:

//Page 1
if(menuOption=='1')
{
  for(i=0; i<1; i++)                                      //CHANGE i VALUE TO 10 AFTER TESTING
  {
    printf("Enter name: ");
    scanf("%s", name[i]);

    printf("Enter gender: ");
    scanf("%s", gender[i]);

    printf("Enter address: ");
    scanf("%s", address[i]);

    printf("Enter contact no: ");
    scanf("%s", contact[i]);

    printf("Enter IC: ");
    scanf("%s", ic[i]);

    putchar('\n');
    puts("enter 1 to return to menu");
    if ((scanf(" %c", &returnOption) == 1) &&
        (returnOption == '1'))
      break;
  }
  system("cls");
}
//Page 2
else if(menuOption=='2')

Обратите внимание, что вы также можете не запрашивать продолжение или нет, когда i будет 9

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