跳过的是其中的t的输入
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct person
{
char name[20]; /* 人名 */
char gender[2]; /* 性别 */
char number[20]; /* 学号 */
}Borrower; /* 借书人信息 */
typedef struct library
{
char title[200]; /* 书名 */
char price[10]; /* 价格 */
char author[20]; /*作者*/
char state[3];
Borrower s ;
}Library;
Library book[2000];
typedef struct Node
{
int value;
Library company;
struct Node *next;
}Node;
void save(Library book[],int end);
void menu1();
void menu2();
int insert(Library first[],int end1);
void delete1(Library first[],int end1);
void change(Library first[]);
void show(Library first[]);
int sll_insert(Node *current,int new_value );
void menu1()
{
puts("1、信息录入");
puts("2、信息帮助");
printf("\n");
}
void save(Library book[],int end)
{
FILE *fp;
int i;
if((fp = fopen("library.txt","w")) == NULL)
{
printf("文件无法打开\n");
return;
}
for(i=0;i<end;i++)
if(fwrite(&book[i],sizeof(Library),1,fp)!= 1)
printf("file write error\n");
fclose(fp);
}
void menu2()
{
puts("1.信息删除");
puts("2、信息修改");
puts("3、信息查找");
getchar();
getchar();
}
int sll_insert(Node *current,int new_value )
{
Node *previous;
Node *New;
while(current->value < new_value)
{
previous = current;
current = current->next;
}
New = (Node*)malloc(sizeof(Node));
if(New == NULL)
return FALSE;
New->value = new_value;
New->next = current;
previous->next = New;
return TRUE;
}
int insert(Library first[],int end1)
{ int j;
int i = 0;
for(j=0;j<end1;j++)
{
printf("请输入\n");
printf("书名: ");
gets(first[j].title);
getchar();
printf("\n");
printf("价格: ");
gets(first[j].price);
getchar();
printf("\n");
printf("作者: ");
gets(first[j].author);
getchar();
printf("\n");
printf("在借or未接 ");
gets(first[j].state);
getchar();
printf("\n");
printf("您的姓名: ");
gets(first[j].s.name);
getchar();
printf("\n");
printf("您的性别: ");
gets(first[j].s.gender);
getchar();
printf("\n");
printf("您的学号: ");
gets(first[j].s.number);
getchar();
printf("\n");
getchar();
i++;
printf("\n这是您存的第%d本书\n",i);
}
getchar();
return i;
}
void delete1(Library first[],int end1)
{int b;
int i;
printf("您要删除第几本书?\n");
scanf("%d",&b);
for(i=b;i<end1;i++)
first[i] = first[i+1];
}
void change(Library first[])
{ int b1,b11;
printf("您要修改第几本书?\n");
scanf("%d",&b1);
printf("您要修改哪个信息?\n");
puts("1、书名");
puts("2、作者");
puts("3、价格");
puts("4、状态");
puts("5、您的姓名");
puts("6、您的性别");
puts("7、您的学号");
getchar();
scanf("%d",&b11);
getchar();
switch(b11)
{
case 1:
{
gets(first[b1-1].title);
getchar();
break;
}
case 2:
{
gets(first[b1-1].author);
getchar();
break;
}
case 3:
{
gets(first[b1-1].price);
break;
}
case 4:
{
gets(first[b1-1].state);
break;
}
case 5:
{
gets(first[b1-1].s.name);
break;
}
case 6:
{
gets(first[b1-1].s.gender);
break;
}
case 7:
{
gets(first[b1-1].s.number);
break;
}
default:
{
printf("ERROR\n");
break;
}
break;
}
}
void show(Library first[])
{int b2;
printf("您要查询哪本书?\n");
scanf("%d",&b2);
puts(first[b2-1].title );
puts(first[b2-1].author);
puts(first[b2-1].price);
puts(first[b2-1].s.name);
puts(first[b2-1].s.gender );
puts(first[b2-1].s.number );
}
int main(void)
{
Library first[2000];
Node book;
int input ;
int t,end1;
int i = 0;
menu1();
scanf("%d",&input);
printf("\n");
memset(first ,0,sizeof(first));
switch(input)
{
case 1:
{
printf("您要存几本书:");
scanf("%d",&end1);
if(end1>2000)
{
printf("抱歉,我无法存超过两千本书\n");
}
i = insert(first,end1);
book.value = i;
getchar();
menu2();
scanf("%d",&t);
switch(t)
{
case 1:
{
delete1(first,end1);
break;
}
case 2:
{ change(first);
break;
}
case 3:
{
show(first);
break;
}
default:
{
printf("ERROR \n");
break;
}
}
save(first,end1);
break;
}
case 2:
{
printf(" 本图书管理系统最多存2000本书,可以存图书的书名,价格,作者等信息,您也必须输入您的相关信息。\n其中系统会自动显示您存储书的编号以方便查找。您也可以对您的信息进行修改。 \n" );
break;
}
default:
printf("抱歉,系统还在维修……\n");
}
system("pause");
return 0;
}
5 个解决方案
#1
建议去掉所有getchar();并且insert函数了gets都改成scanf;换成scanf("%s", xxx);就可去掉所有getchar();
getchar()主要针对gets和scanf("%c", xxx);的。
还有一种办法,就是去掉insert函数里所有getchar();只在insert调用前加一个getchar();即可,其他地方的getchar()也一并去掉;
getchar()主要针对gets和scanf("%c", xxx);的。
还有一种办法,就是去掉insert函数里所有getchar();只在insert调用前加一个getchar();即可,其他地方的getchar()也一并去掉;
#2
fflush(stdin);
#3
http://blog.csdn.net/zhagoodwell/article/details/77422530
里面的第一个代码 把输入的字符串的函数 都改为Getchar函数 就行~而且那个函数很不错
里面的第一个代码 把输入的字符串的函数 都改为Getchar函数 就行~而且那个函数很不错
#4
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct person
{
char name[9]; /* 人名 */
char gender[3]; /* 性别 */
char number[15]; /* 学号 */
} Borrower; /* 借书人信息 */
typedef struct library
{
char title[101]; /* 书名 */
char price[11]; /* 价格 */
char author[9]; /*作者*/
char state[5];
Borrower s ;
} Library;
Library book[2000];
typedef struct Node
{
int value;
Library company;
struct Node *next;
} Node;
void save(Library book[],int end);
void menu1();
void menu2();
int insert(Library first[],int end1);
void delete1(Library first[],int end1);
void change(Library first[],int end1);
void show(Library first[]);
int sll_insert(Node *current,int new_value );
int gainchar(char *A,int min,int max);//长度在[min,max] <闭区间> 之间时 函数结束 返回字符串A的长度
int gainint(int *p,int a,int b);//输入int *p直至满足(a,b)输入结束,并返回*p的值
void menu1()
{
puts("1、信息录入");
puts("2、信息帮助");
printf("3、一个汉字两个字节\n");
printf("\n");
}
void save(Library book[],int end)
{
FILE *fp;
int i;
if((fp = fopen("library.txt","w")) == NULL)
{
printf("文件无法打开\n");
return;
}
for(i=0; i<end; i++)
if(fwrite(&book[i],sizeof(Library),1,fp)!= 1)
printf("file write error\n");
fclose(fp);
}
void menu2()
{
puts("1.信息删除");
puts("2、信息修改");
puts("3、信息查找");
}
int sll_insert(Node *current,int new_value )
{
Node *previous;
Node *New;
while(current->value < new_value)
{
previous = current;
current = current->next;
}
New = (Node*)malloc(sizeof(Node));
if(New == NULL)
return FALSE;
New->value = new_value;
New->next = current;
previous->next = New;
return TRUE;
}
int insert(Library first[],int end1)
{
int j;
int i = 0;
for(j=0; j<end1; j++)
{
printf("请输入\n");
printf("书名: ");
gainchar(first[j].title,1,100);
printf("价格: ");
gainchar(first[j].price,1,10);
printf("作者: ");
gainchar(first[j].author,1,8);
printf("\n");
printf("在借or未接 ");
gainchar(first[j].state,4,4);
printf("\n");
printf("您的姓名: ");
gainchar(first[j].s.name,2,8);
printf("\n");
printf("您的性别: ");
gainchar(first[j].s.gender,2,2);
printf("\n");
printf("您的学号: ");
gainchar(first[j].s.number,6,14);
i++;
printf("\n这是您存的第%d本书\n",i);
}
return i;
}
void delete1(Library first[],int end1)
{
int b;
int i;
printf("您要删除第几本书?[1,%d]\n",end1);
gainint(&b,1,end1);
for(i=b; i<end1; i++)
first[i] = first[i+1];
}
void change(Library first[],int end1)
{
int b1,b11;
printf("您要修改第几本书?\n");
gainint(&b1,1,end1);
printf("您要修改哪个信息?\n");
puts("1、书名");
puts("2、作者");
puts("3、价格");
puts("4、状态");
puts("5、您的姓名");
puts("6、您的性别");
puts("7、您的学号");
gainint(&b11,1,7);
switch(b11)
{
case 1:
{
gainchar(first[b1-1].title,1,100);
break;
}
case 2:
{
gainchar(first[b1-1].author,2,8);
break;
}
case 3:
{
gainchar(first[b1-1].price,1,10);
break;
}
case 4:
{
gainchar(first[b1-1].state,4,4);
break;
}
case 5:
{
gainchar(first[b1-1].s.name,2,8);
break;
}
case 6:
{
gainchar(first[b1-1].s.gender,2,2);
break;
}
case 7:
{
gainchar(first[b1-1].s.number,6,14);
break;
}
default:
{
printf("ERROR\n");
break;
}
break;
}
}
void show(Library first[])
{
int b2;
printf("您要查询哪本书?\n");
scanf("%d",&b2);
puts(first[b2-1].title );
puts(first[b2-1].author);
puts(first[b2-1].price);
puts(first[b2-1].s.name);
puts(first[b2-1].s.gender );
puts(first[b2-1].s.number );
}
int main(void)
{
Library first[2000];
Node book;
int input ;
int t,end1;
int i = 0;
menu1();
scanf("%d",&input);
printf("\n");
memset(first ,0,sizeof(first));
switch(input)
{
case 1:
{
printf("您要存几本书:");
scanf("%d",&end1);
if(end1>2000)
{
printf("抱歉,我无法存超过两千本书\n");
}
i = insert(first,end1);
book.value = i;
menu2();
scanf("%d",&t);
switch(t)
{
case 1:
{
delete1(first,end1);
break;
}
case 2:
{
change(first,end1);
break;
}
case 3:
{
show(first);
break;
}
default:
{
printf("ERROR \n");
break;
}
}
save(first,end1);
break;
}
case 2:
{
printf(" 本图书管理系统最多存2000本书,可以存图书的书名,价格,作者等信息,您也必须输入您的相关信息。\n其中系统会自动显示您存储书的编号以方便查找。您也可以对您的信息进行修改。 \n" );
break;
}
default:
printf("抱歉,系统还在维修……\n");
}
system("pause");
return 0;
}
int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束,并返回*p的值
{
do
{
*p=a-1; //此处是为了减少意外情况的发生 虽然那种意外情况不常见
scanf("%d",p);
while(getchar()!='\n');
if(*p>b||*p<a)
printf("输入有误,请重新输入[%d--%d]:",a,b);
}
while(*p>b||*p<a);
return *p;
}
int gainchar(char *A,int min,int max)//长度在[min,max] <闭区间> 之间时 函数结束 返回字符串A的长度
{
int B,C;
do
{
A[max]=B=C=0;
while((A[B++]=getchar())!='\n'&&B<max);
if(A[B-1]!='\n')while(getchar()!='\n'&&++C);
else A[--B]=0;
if(C||B&&B<min)
printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);
}
while(C||B<min);
return B;
}
这是我改过得,你看看 另外如果你想让你的 图书管理系统 gengwanshan 更完善包括 名字的检测 等等 加我QQ 2423824433
#5
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
#1
建议去掉所有getchar();并且insert函数了gets都改成scanf;换成scanf("%s", xxx);就可去掉所有getchar();
getchar()主要针对gets和scanf("%c", xxx);的。
还有一种办法,就是去掉insert函数里所有getchar();只在insert调用前加一个getchar();即可,其他地方的getchar()也一并去掉;
getchar()主要针对gets和scanf("%c", xxx);的。
还有一种办法,就是去掉insert函数里所有getchar();只在insert调用前加一个getchar();即可,其他地方的getchar()也一并去掉;
#2
fflush(stdin);
#3
http://blog.csdn.net/zhagoodwell/article/details/77422530
里面的第一个代码 把输入的字符串的函数 都改为Getchar函数 就行~而且那个函数很不错
里面的第一个代码 把输入的字符串的函数 都改为Getchar函数 就行~而且那个函数很不错
#4
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct person
{
char name[9]; /* 人名 */
char gender[3]; /* 性别 */
char number[15]; /* 学号 */
} Borrower; /* 借书人信息 */
typedef struct library
{
char title[101]; /* 书名 */
char price[11]; /* 价格 */
char author[9]; /*作者*/
char state[5];
Borrower s ;
} Library;
Library book[2000];
typedef struct Node
{
int value;
Library company;
struct Node *next;
} Node;
void save(Library book[],int end);
void menu1();
void menu2();
int insert(Library first[],int end1);
void delete1(Library first[],int end1);
void change(Library first[],int end1);
void show(Library first[]);
int sll_insert(Node *current,int new_value );
int gainchar(char *A,int min,int max);//长度在[min,max] <闭区间> 之间时 函数结束 返回字符串A的长度
int gainint(int *p,int a,int b);//输入int *p直至满足(a,b)输入结束,并返回*p的值
void menu1()
{
puts("1、信息录入");
puts("2、信息帮助");
printf("3、一个汉字两个字节\n");
printf("\n");
}
void save(Library book[],int end)
{
FILE *fp;
int i;
if((fp = fopen("library.txt","w")) == NULL)
{
printf("文件无法打开\n");
return;
}
for(i=0; i<end; i++)
if(fwrite(&book[i],sizeof(Library),1,fp)!= 1)
printf("file write error\n");
fclose(fp);
}
void menu2()
{
puts("1.信息删除");
puts("2、信息修改");
puts("3、信息查找");
}
int sll_insert(Node *current,int new_value )
{
Node *previous;
Node *New;
while(current->value < new_value)
{
previous = current;
current = current->next;
}
New = (Node*)malloc(sizeof(Node));
if(New == NULL)
return FALSE;
New->value = new_value;
New->next = current;
previous->next = New;
return TRUE;
}
int insert(Library first[],int end1)
{
int j;
int i = 0;
for(j=0; j<end1; j++)
{
printf("请输入\n");
printf("书名: ");
gainchar(first[j].title,1,100);
printf("价格: ");
gainchar(first[j].price,1,10);
printf("作者: ");
gainchar(first[j].author,1,8);
printf("\n");
printf("在借or未接 ");
gainchar(first[j].state,4,4);
printf("\n");
printf("您的姓名: ");
gainchar(first[j].s.name,2,8);
printf("\n");
printf("您的性别: ");
gainchar(first[j].s.gender,2,2);
printf("\n");
printf("您的学号: ");
gainchar(first[j].s.number,6,14);
i++;
printf("\n这是您存的第%d本书\n",i);
}
return i;
}
void delete1(Library first[],int end1)
{
int b;
int i;
printf("您要删除第几本书?[1,%d]\n",end1);
gainint(&b,1,end1);
for(i=b; i<end1; i++)
first[i] = first[i+1];
}
void change(Library first[],int end1)
{
int b1,b11;
printf("您要修改第几本书?\n");
gainint(&b1,1,end1);
printf("您要修改哪个信息?\n");
puts("1、书名");
puts("2、作者");
puts("3、价格");
puts("4、状态");
puts("5、您的姓名");
puts("6、您的性别");
puts("7、您的学号");
gainint(&b11,1,7);
switch(b11)
{
case 1:
{
gainchar(first[b1-1].title,1,100);
break;
}
case 2:
{
gainchar(first[b1-1].author,2,8);
break;
}
case 3:
{
gainchar(first[b1-1].price,1,10);
break;
}
case 4:
{
gainchar(first[b1-1].state,4,4);
break;
}
case 5:
{
gainchar(first[b1-1].s.name,2,8);
break;
}
case 6:
{
gainchar(first[b1-1].s.gender,2,2);
break;
}
case 7:
{
gainchar(first[b1-1].s.number,6,14);
break;
}
default:
{
printf("ERROR\n");
break;
}
break;
}
}
void show(Library first[])
{
int b2;
printf("您要查询哪本书?\n");
scanf("%d",&b2);
puts(first[b2-1].title );
puts(first[b2-1].author);
puts(first[b2-1].price);
puts(first[b2-1].s.name);
puts(first[b2-1].s.gender );
puts(first[b2-1].s.number );
}
int main(void)
{
Library first[2000];
Node book;
int input ;
int t,end1;
int i = 0;
menu1();
scanf("%d",&input);
printf("\n");
memset(first ,0,sizeof(first));
switch(input)
{
case 1:
{
printf("您要存几本书:");
scanf("%d",&end1);
if(end1>2000)
{
printf("抱歉,我无法存超过两千本书\n");
}
i = insert(first,end1);
book.value = i;
menu2();
scanf("%d",&t);
switch(t)
{
case 1:
{
delete1(first,end1);
break;
}
case 2:
{
change(first,end1);
break;
}
case 3:
{
show(first);
break;
}
default:
{
printf("ERROR \n");
break;
}
}
save(first,end1);
break;
}
case 2:
{
printf(" 本图书管理系统最多存2000本书,可以存图书的书名,价格,作者等信息,您也必须输入您的相关信息。\n其中系统会自动显示您存储书的编号以方便查找。您也可以对您的信息进行修改。 \n" );
break;
}
default:
printf("抱歉,系统还在维修……\n");
}
system("pause");
return 0;
}
int gainint(int *p,int a,int b)//输入int *p直至满足(a,b)输入结束,并返回*p的值
{
do
{
*p=a-1; //此处是为了减少意外情况的发生 虽然那种意外情况不常见
scanf("%d",p);
while(getchar()!='\n');
if(*p>b||*p<a)
printf("输入有误,请重新输入[%d--%d]:",a,b);
}
while(*p>b||*p<a);
return *p;
}
int gainchar(char *A,int min,int max)//长度在[min,max] <闭区间> 之间时 函数结束 返回字符串A的长度
{
int B,C;
do
{
A[max]=B=C=0;
while((A[B++]=getchar())!='\n'&&B<max);
if(A[B-1]!='\n')while(getchar()!='\n'&&++C);
else A[--B]=0;
if(C||B&&B<min)
printf("您录入的字符串长度:%d字节\n只录入(%d--%d)个字节!\n",B+C,min,max);
}
while(C||B<min);
return B;
}
这是我改过得,你看看 另外如果你想让你的 图书管理系统 gengwanshan 更完善包括 名字的检测 等等 加我QQ 2423824433
#5
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。