【问题标题】:The array doesn't change and third scanf doesn't let me input anything数组没有改变,第三个 scanf 不允许我输入任何内容
【发布时间】: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", &amp;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] 相同。

标签: arrays c scanf


【解决方案1】:

看看你的代码:

scanf(" %c", session); // ... WHEN I REMOVE THE SAPCE ...

session 的类型是 char[](即 char 数组),但您在会话中只存储了一个 %c(单个字符)。此外,您还没有给出任何指示内存位置的 & 符号。

因此,将其更改为:

#define MAX 10
char session[MAX];
scanf("%s", session);

另一种方法是使用 cmets 中指示的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

您现在可以保留空间(SESSION AVAILABLE 案例):

scanf(" %c", &ans);

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

【讨论】:

  • 谢谢。这工作正常。如果可以的话,请帮我解决数组的问题。
  • @Nathali 如果要存储 M x N(行 * 列)数组,则使用两个嵌套循环(一个用于 i &lt; M,另一个用于 j &lt; N)并初始化它们。
  • 好的,我会试试的。再次感谢您。
【解决方案2】:

您可以在代码中尝试使用 %s 来代替使用 %c,或者您可以使用 gets(session);

  if (response == 'A'){

          printf("\n\nCHOOSE A DAY     :   ");
          scanf("%d",&day);
          j = day -1;
          printf("YOUR SESSION     :   "); 

          //scanf(" %s",session);    //try this one 
          //gets(session);          //or this one
         }

         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

【讨论】:

  • 请不要建议使用已弃用且不安全的gets,而只建议使用fgets。
  • @SergeBallesta 是的,这是我的错...我是新手,所以我仍在学习并向大家分享知识...感谢您纠正我的错误...
猜你喜欢
  • 2021-05-28
  • 2021-11-12
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
相关资源
最近更新 更多