进入第一页或第二页并返回菜单后,我只能访问第一页,而不能访问第二页。
我尝试将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;
}
}
}
}
即使之前已经访问过某个页面,该程序也应允许您从菜单中输入任何页面。
答案 0 :(得分:2)
在
char name[10][15]={"jay"},..., menuOption, returnOption; while(returnOption!=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时,您也可以不要求继续操作