user-0 提问: 急急急！！！求C语言大神一枚！！！

回复:
user: user-1
content: scanf把你前面输入(1、2、3)之后输入的enter键给接收了，当然程序就直接结束了

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-0
content: 补充一下，我的程序主要实在Linux 下运行

user: user-0
content: 首先谢谢大家的帮忙！经过各种测试发现这样也行，不过测试条件还是不好，当询问是是否继续时还是不行。。。球大神指点！ 结果如下：  代码如下，和#20的类似  void main() {     int c,u;     char ans;否     do     {      u=User_Choice();      c=Computer_Choice();      Compare(c,u);      printf("还要继续玩吗？(y/n):");      scanf("%c",&ans);      scanf("%c",&ans);      if((ans=='n')||(ans=='N')) break;     }while((ans=='y')||(ans=='Y'));     printf("谢谢使用！欢迎下次再玩！\n"); }

user: user-0
content: 回复#26，好吧，怪我没说清楚！

user: user-3
content: 我在18楼就给了全部代码 和你的代码差别并不大,你是可以看得懂的,至少你试一下效果有所比较 当看到你在25楼说这话的时候,说明你根本就没去看 我觉得给你任何提示和帮助都是白费力气,不值

user: user-0
content: 回复#19和#21：两个主函数的测试条件写的都不太好，但是我不会写，求指教！

user: user-4
content: 回车换行的问题我也遇到过，一般用scanf的地方我都自己写一个函数代替

user: user-3
content: 你是怎么测的,你输入一个即不是N也不是Y的键试试

user: user-5
content: #include<stdio.h> #include<time.h> #include<stdlib.h>   int User_Choice() {     int u;     do     {         printf("请出拳(1-石头，2-剪刀，3-布)：");         scanf("%d",&u);         switch(u)         {             case 1:printf("你出的是石头!\n");break;             case 2:printf("你出的是剪刀!\n");break;             case 3:printf("你出的是布!\n");break;             default:printf("你的输入有误，请重新输入！\n");continue;         }     }while(u<1||u>3);     return u; }   int Computer_Choice() {     int c;     srand(time(NULL));     c=rand()%3+1;     switch(c)     {         case 1:printf("电脑出的是石头!\n");break;         case 2:printf("电脑出的是剪刀!\n");break;         case 3:printf("电脑出的是布!\n");break;     }     return c; }   void Compare(int c, int u) {     if((u==1 && c==2)||(u==2 && c==3)||(u==3 && c==1))     printf("你赢了！\n");     if((c==1 && u==2)||(c==2 && u==3)||(c==3 && u==1))     printf("电脑赢了！\n");     if(u==c)     printf("你和电脑打平了！\n"); }     /*void main() {     int c,u;     int flag=1;     do     {      u=User_Choice();      c=Computer_Choice();      Compare(c,u);      printf("还要继续玩吗？(1/0):");      scanf("%d",&flag);      if(flag==0) break;     }while(flag==1);     printf("谢谢使用！欢迎下次再玩！\n"); }    */    void main() {     int c,u;     char ans;     do     {      u=User_Choice();      c=Computer_Choice();      Compare(c,u);      printf("还要继续玩吗？(y/n):"); 	 getchar();      scanf("%c",&ans);      //if((ans=='n')||(ans=='N')) break;     }while((ans=='y')||(ans=='Y'));     printf("谢谢使用！欢迎下次再玩！\n"); }     这个亲测行！

user: user-3
content: 你的第一个主函数也不行,不信你选择输入9看看

user: user-3
content: #include "conio.h" #include <stdlib.h> #include<stdio.h>   int User_Choice() {     char u;     do     {         printf("请出拳(1-石头，2-剪刀，3-布)\n");         u=getch();         switch(u)         {             case '1':printf("你出的是石头!\n");break;             case '2':printf("你出的是剪刀!\n");break;             case '3':printf("你出的是布!\n");break;             default:printf("你的输入有误，请重新输入！\n");continue;         }     }while(u<'1'||u>'3');     return (u-0x30)&0xFF; }   int Computer_Choice() {     int c;     srand(time(0));     c=rand()%3+1;     switch(c)     {         case 1:printf("电脑出的是石头!\n");break;         case 2:printf("电脑出的是剪刀!\n");break;         case 3:printf("电脑出的是布!\n");break;     }     return c; }   void Compare(int c, int u) {     if((u==1 && c==2)||(u==2 && c==3)||(u==3 && c==1))     printf("你赢了！\n");     if((c==1 && u==2)||(c==2 && u==3)||(c==3 && u==1))     printf("电脑赢了！\n");     if(u==c)     printf("你和电脑打平了！\n"); }     void main() {     int c,u;     char flag;     do     {      u=User_Choice();      c=Computer_Choice();      Compare(c,u);      printf("还要继续玩吗？(y/n)\n\n"); 	 flag=0; 	 while(flag!='y'&&flag!='n'&&flag!='Y'&&flag!='N') 		 flag=getch();      if(flag=='n'||flag=='N') break;     }while(1);     printf("谢谢使用！欢迎下次再玩！\n"); }

user: user-0
content: #15的方法虽然可以，但是浪费了内存！不过还是谢谢你！

user: user-0
content: 这样不是浪费内存空间吗？

user: user-6
content: 还费这劲干啥…… char c [10]; /* …… */      scanf("%s", c); }while (c[0]=='y' || c[0]=='Y');

user: user-0
content: #13的请问怎样解决？

user: user-7
content: 回车换行符是关键, 需要使用什么技术, 去吃掉回车换行符. fflush就是做这个的. 也有其它办法.  论坛中, 这个问题也基本上是月经帖了.  其实要发现这个问题, 只要调试运行下, 就知道原因何在了.  只可惜很多初学的朋友对调试程序处于: "怕, 不知如何下手" 的状态.

user: user-8
content: 引用 11 楼 xiaofeige567 的回复:楼上的谢谢！为什么用第一个主函数就行呢？！ 第一个main函数中scanf的格式为%d，只匹配十进制数字输入，自动忽略了stdin中残留的\r\n

user: user-0
content: 楼上的谢谢！为什么用第一个主函数就行呢？！

user: user-8
content: 程序运行过程中，函数User_choice中的scanf除了接收用户输入的数值外，还包括末尾的\r\n，第2个main函数中的scanf使用%c格式，将之前残留在stdin中的\r作为输入赋给ans，导致while循环结束。   #4的fflush在linux下不生效。   还有一个简单的方法，将第二个main中调用scanf的%c前面加一个空格，可以忽略stdin中的white space。