Arrays 该数组没有';不改变,第三次扫描不';不要让我输入任何东西

Arrays 该数组没有';不改变,第三次扫描不';不要让我输入任何东西,arrays,c,scanf,Arrays,C,Scanf,所以这个节目是用来预订活动的。我一直在处理这个项目的一些问题,我想不出更好的解决办法。程序还没有完成。我只为案例A编写了程序。我已经解释了下面的两个问题 #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}}; ch

所以这个节目是用来预订活动的。我一直在处理这个项目的一些问题,我想不出更好的解决办法。程序还没有完成。我只为案例A编写了程序。我已经解释了下面的两个问题

#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;
}
第二个问题:预订前数组[i][j]为0,因此在他们确认预订后数组[i][j]应为1。例如,如果我想预订第1天(j=0)的上午会话(I=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,您可以在代码中尝试%s,也可以使用gets(会话)

看看你的代码:

scanf(" %c", session); // ... WHEN I REMOVE THE SAPCE ...
会话
的类型为
char[]
(即字符数组),但在会话中仅存储
%c
(单个字符)。此外,您还没有给出任何指示内存位置的符号

因此,将其更改为:

#define MAX 10
char session[MAX];
scanf("%s", session);
另一种方法是使用注释中指出的
fgets()
,但可能需要截断由其引起的换行:

#define MAX 10
char session[MAX];

fgets(session, MAX, stdin); // it'll accepts whitespaces too!
session[strlen(session) - 1] = '\0'; // to avoid the extra newline
您现在可以保留空间(
会话可用
案例):



作为底线,您应该始终验证输入是否被正确接受(即验证
scanf
返回的值是否与传入的参数完全相等),以避免程序中产生奇怪的行为。

“%c”
中的空格跳过空白,在您的例子中,上一个
scanf
留下的换行符。您也需要在最后一个
scanf
中执行相同的操作。或者更好的是,
字符行[128]和对于每个输入
fgets(行、行大小、标准输入值)
,然后例如
如果(sscanf(行、%d、&day)!=1){/*处理错误*/}
。使用像
fgets
这样的面向行的输入函数可以避免在输入缓冲区中留下未读字符,从而导致下一次输入失败。对于新的C程序员来说,单独使用
scanf()
充满了陷阱。您只需1
printf
即可输出整个菜单。...@DavidC.Rankin如果我这样更改它,是否正确?fgets(生产线、尺寸(生产线)、标准DIN);sscanf(第%c行,会话)<代码>会话
是一个数组。您使用
sscanf
就像
scanf
一样,除了从缓冲区
行读取字符而不是
stdin
——为什么要使用
%c
而不是
%s”
?(或者为什么会话是一个数组而不是
char
?)如果您只是查看第一个字符,请使用
fgets(line,sizeof line,stdin)
然后
*line
(相当于
line[0]
——您的选择),然后您可以简单地执行
如果(*line='M')…
等等。如果您在挠头
*line
*(line+0)
,这与
line[0]相同
。请不要建议使用不推荐使用且不安全的
gets
,但只能使用
fgets
@SergeBallesta是的,这是我的错…我是一个新手,所以我仍在学习并与大家分享知识…感谢您纠正我的错误…谢谢。这工作正常。如果可以,请帮助我解决阵列问题@Nathali如果要存储M x N(行*列)数组,请使用两个嵌套循环(一个用于
i
,另一个用于
j
)并初始化它们。好的,我会尝试一下。再次感谢。
#define MAX 10
char session[MAX];
scanf("%s", session);
#define MAX 10
char session[MAX];

fgets(session, MAX, stdin); // it'll accepts whitespaces too!
session[strlen(session) - 1] = '\0'; // to avoid the extra newline
scanf(" %c", &ans);