user-0 提问: C语言为什么输入有时会跳过，即使加了getchar()也没用

回复:
user: user-1
content: 在每个最后不带\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字符或回车换行，读取下一个字符。

user: user-2
content: #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

user: user-2
content: http://blog.csdn.net/zhagoodwell/article/details/77422530  里面的第一个代码   把输入的字符串的函数  都改为Getchar函数  就行～而且那个函数很不错

user: user-3
content: fflush(stdin);

user: user-4
content: 建议去掉所有getchar();并且insert函数了gets都改成scanf；换成scanf("%s", xxx);就可去掉所有getchar(); getchar()主要针对gets和scanf("%c", xxx);的。  还有一种办法，就是去掉insert函数里所有getchar();只在insert调用前加一个getchar();即可，其他地方的getchar()也一并去掉；