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

时间:2022-12-28 09:04:42
我后面的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;
}

 
 

5 个解决方案

#1


建议去掉所有getchar();并且insert函数了gets都改成scanf;换成scanf("%s", xxx);就可去掉所有getchar();
getchar()主要针对gets和scanf("%c", xxx);的。

还有一种办法,就是去掉insert函数里所有getchar();只在insert调用前加一个getchar();即可,其他地方的getchar()也一并去掉;

#2



fflush(stdin);

#3


http://blog.csdn.net/zhagoodwell/article/details/77422530

里面的第一个代码   把输入的字符串的函数  都改为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的返回值。
//请今后要用
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()也一并去掉;

#2



fflush(stdin);

#3


http://blog.csdn.net/zhagoodwell/article/details/77422530

里面的第一个代码   把输入的字符串的函数  都改为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的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。