【发布时间】:2020-08-05 06:01:31
【问题描述】:
所以这个程序是为活动预订而设计的。我一直在处理这个程序的一些问题,我想不出更好的解决方案。程序不完整。我只写了案例A的程序。我已经解释了下面的2个问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int i, j, day, x;
char session[10];
int array[2][5] = {{0,0,1,0,1},{1,1,0,0,0}};
char response,ans,choice;
printf("\n**************** WELCOME TO NAT RESERVATION SYSTEM ****************");
printf("\n\nCHOOSE WHAT TO DO");
printf("\n\n\t\tA.\t\tBOOK THE THEATER\n");
printf("\t\tB.\t\tCHECK RESERRVATIONS\n");
printf("\t\tC.\t\tREMOVE RESERVATIONS\n");
printf("\t\tD.\t\tCALCULATE INCOME\n");
printf("\t\tE.\t\tEXIT\n");
printf("\n\nYOUR RESPONSE\t\t: ");
scanf(" %c",&response);
switch (response){
case 'A': printf("\n\nBOOK THE THEATER"); break;
case 'B': printf("\n\nCHECK RESERRVATIONS"); break;
case 'C': printf("\n\nREMOVE RESERVATIONS"); break;
case 'D': printf("\n\nCALCULATE INCOME"); break;
case 'E': printf("\n\nEXIT"); break;
}
第一个问题: 第三个 scanf 不允许我输入任何内容。即使我将其更改为 scanf (" %c",&ans);同样的事情也会发生。我试图删除第二个 scanf 中的空格,但是当我这样做时,它不会让我在其中输入任何内容,但可以在第三个 scanf 中输入(希望你理解我的问题)
if (response == 'A'){
printf("\n\nCHOOSE A DAY : ");
scanf("%d",&day);
j = day -1;
printf("YOUR SESSION : ");
scanf(" %c",session); //WHEN I REMOVE THE SAPCE IT DOESNT LET ME INPUT ANYTHING
if(session[0] == 'M'){
i = 0;
}
if(session[0] == 'A'){
i = 1;
}
if(array[i][j] == 0){
printf("\n\nTHE SESSION IS AVAILABLE.\nDO YOU WANT TO CONFIRM THE BOOKING?(Y/N) : ");
scanf("%c",&ans); //3RD SCANF IF I KEEP A SPACE IN THE SECOND SCANF, I CANT INPUT ANYTHING HERE
第二个问题:数组[i][j]在预订前为0,所以在他们确认预订后,数组[i][j]应该为1。例如,如果我想预订早上的会议(i=0)第 1 天(j=0)。在我提供输入后,它显示会话可用。然后我确认预订数组 [0] [0] 应该是 1。但如果我再次提供相同的输入,它显示会话可用。但我希望它显示会话不可用。
if(ans == 'Y' || ans == 'y'){
array[i][j] = 1;
printf("\nYOUR BOOKING WAS SUCCESSFUL!\n\n");
main();
}
}
if(array[i][j] == 1){
printf("\n\nTHE SESSION IS NOT AVAILABLE.");
printf("\nDO YOU WANT TO TRY ANOTHER SESSION?(Y/N): ");
scanf(" %c",&ans);
if(ans == 'Y' || ans == 'y'){
main();
}else if(ans == 'N' || ans == 'n'){
printf("THANK YOU! HAVE A NICE DAY!");
exit(0);
}
}
}
return 0;
}
感谢任何帮助。谢谢
【问题讨论】:
-
" %c"中的空格会跳过空格,在您的情况下是前一个scanf留下的换行符。你也需要在最后一个scanf中做同样的事情。 -
或者更好,
char line[128];和每个输入fgets(line, sizeof line, stdin)然后例如if (sscanf(line, "%d", &day) != 1) { /* handle error */ }。使用像fgets这样的面向行的 输入函数可以避免在输入缓冲区中留下未读字符,这可能会导致下一次输入失败。单独使用scanf()对新的C 程序员来说充满了陷阱。您只需要 1 个printf即可输出您的整个菜单... -
@DavidC.Rankin 如果我这样更改,是否正确? fgets(线,sizeof(线),标准输入); sscanf(line,"%c",session);
-
session是一个数组。你使用sscanf就像scanf一样,除了你从缓冲区读取字符line而不是stdin。-- 你为什么使用"%c而不是"%s"? (或者为什么 session 是一个数组而不是char?) -
如果你只看第一个字符,只需使用
fgets(line, sizeof line, stdin),然后使用*line(相当于line[0]——你的选择)然后你可以简单地使用if (*line == 'M') ...等等.如果你摸不着头脑,*line是*(line + 0),与line[0]相同。