我为“图书馆管理”编写了以下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-while
和switch
/ 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”循环上进行更改并添加一些可以解决此问题的代码吗?
谢谢。