事先进入页面后无法从菜单进入第二页

时间:2019-04-19 17:11:49

标签: c

进入第一页或第二页并返回菜单后,我只能访问第一页,而不能访问第二页。

我尝试将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 个答案:

答案 0 :(得分:2)

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...读取的字符数,以保护数组溢出,例如, name 可以存储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时,您也可以不要求继续操作