C语言为什么输入有时会跳过,即使加了getchar()也没用

vwyf0305 2018-03-01 04:22:23
我后面的scanf函数有时会跳过,不知道为什么。
跳过的是其中的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;
}


...全文
1158 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-02
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
zhagoodwell 2018-03-01
  • 打赏
  • 举报
回复
#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
zhagoodwell 2018-03-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhagoodwell/article/details/77422530 里面的第一个代码 把输入的字符串的函数 都改为Getchar函数 就行~而且那个函数很不错
destory27 2018-03-01
  • 打赏
  • 举报
回复
fflush(stdin);
自信男孩 2018-03-01
  • 打赏
  • 举报
回复
建议去掉所有getchar();并且insert函数了gets都改成scanf;换成scanf("%s", xxx);就可去掉所有getchar(); getchar()主要针对gets和scanf("%c", xxx);的。 还有一种办法,就是去掉insert函数里所有getchar();只在insert调用前加一个getchar();即可,其他地方的getchar()也一并去掉;

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧