为什么在此处跳过“ bookdata [] []”的第一个元素的“ for”循环的第一轮的INPUT?

时间:2019-04-22 05:33:00

标签: c

我为“图书馆管理”编写了以下C程序(使用Code :: Blocks并在其他编译器上进行了尝试),用于“图书馆管理”,其中添加了带有一些详细信息的书籍条目。

为了存储书籍详细信息,我在这里使用了一个名为bookdata_s的结构数组(不同的书籍由其索引标识),并包含一个字符数组bookdata[ ][ ](用于存储个人详细信息书)。 但是代码不只接受for循环的第一轮输入。 跳过字符数组"ISBN"的第一个元素的输入。我不知道为什么会这样。这是一种意料之外的异常。据了解,代码的每种语法和逻辑都是正确的。

我做了一些有趣的实验-

1)我认为这可能是由于gets()导致的,所以我用fgets()代替了它(gets()有时可行,但使用起来总是很危险)。 =>这不起作用。

2)我通过将getchar()替换为scanf()来尝试了代码。

由于getchar()有时会跳过自己的输入,因此我怀疑它也会影响其他人。我对gets()也有这种想法。这就是为什么我试图排除这两个函数)=>失败:(

3)我删除了switch ()语句,然后开始运行。=>无效。 并将“ switch”替换为“ if-else”,但再次跳过了输入。

4)然后我删除了do-while并执行了。=>同样的问题。

5)然后,最后我同时删除了do-whileswitch / if,然后执行了。=>它成功接受了"ISBN"的输入。 :)

6)如果您添加另一个外部“ for”循环,它将变得容易受到攻击。 它不需要输入2个循环。

仅在for循环的第一轮中跳过输入。

#include<stdio.h>

int i, j, NB=0, BE, LL=7, LL_search=5;
//NB->No. of Books, LL->LabelList, LL_search->LabelList to be displayed/used for searching of book
//i->Book index , j->Label index

struct bookdata_s
{   char bookdata[7][10];
};

int main()
{    //Label List 'LL'
    char labelname[7][30]={"ISBN",  //0
                            "Title",//1
                            "Author",
                            "Publisher",
                            "Language",
                            "Type",
                            "Cupboard-Shelf No."//6};


    struct bookdata_s bd[100];
    char response='1';

    //Preinstructions   
    printf("\n\n 1 New Book Entry\n 5 Exit\n ");

    do{     
      BE=100-NB;
      printf(" \tTotal Book Entries = %d\t Blank Entries = %d",NB,BE);
      printf("\nEnter the corresponding index number, for the action,  \nhere :  ");
      response=getchar();

      switch (response)
       {      case '1'://For input of bookdata/adding of new entry
                       printf("Enter Book Details : \n");
                       for(j=0; j<NDL; j++)
                       {
                          printf("Enter %s : ",labelname[j]);
                          fgets(bd[NB].bookdata[j],10,stdin);
                          //gets(bd[NB].bookdata[j]);

                       }  NB++;  //Increments for every entry

              continue;

              case '5':
                        printf("Exiting the program");
              break;


         }

    }while(response!='5');

            return 0;
}

从此代码中,我不希望在任何地方跳过输入。 实际上输出是

1 New Book Entry 
.
.
.
Enter Book Details
Enter ISBN Enter Title  <-here cursor waits for taking input

printf()打印的结果中可以清楚地看出,第一个循环已执行,但没有为该循环获取输入。但是对于以后的循环,它可以按命令和预期的方式工作。 请指导我,为什么我每次实验都能得到这样的结果?

为什么第一个元素"ISBN"的输入被跳过? 我需要在“ for”循环上进行更改并添加一些可以解决此问题的代码吗?

谢谢。

0 个答案:

没有答案