求教!为什么进入第二次循环,scanf和gets是同时执行的?(新手刚学C)

时间:2022-09-18 11:23:54
#include <stdio.h>
#define MAX 100
int main()
{
       int i,n,ch = 1, flag = 1;
       char str[MAX];
       while(ch == 1){
       printf("\t\t请输入一串字符:");
       gets(str);
       for(i = 0; str[i] != '\0'; i++)
          ;
       for(n = 0; n < i; n++)
             if(str[n] != str[i-n-1])
                 flag = 0;        
       if(flag == 1){
            printf("\n\n\t\t字符串:["); 
            printf("%s", str);
            printf("]是回文!");
            }else
                  printf("\n\n\t\t字符串:[%s]不是回文!", str);
            printf("\n\n是否继续:1 是; 2 否 \n");
            printf("请选择:");
            scanf("%d", &ch);      
            }
       getch();
       return 0;
 }

9 个解决方案

#1



}else{//缺了个{
  printf("\n\n\t\t字符串:[%s]不是回文!", str);
  printf("\n\n是否继续:1 是; 2 否 \n");
  printf("请选择:");
  scanf("%d", &ch);   
  }

#2


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

#3


这样while也缺少了{,乱拉!

#4


引用 1 楼 sundayx 的回复:
C/C++ code

}else{//缺了个{
  printf("\n\n\t\t字符串:[%s]不是回文!", str);
  printf("\n\n是否继续:1 是; 2 否 \n");
  printf("请选择:");
  scanf("%d", &amp;ch);   
  }


你没仔细看吧!

#5


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

不好意思,我看不懂...都没见过...

#6


哦,我看错了,呵呵。最好用插入源代码,那样有格式。
在scanf后加上一个getchar();获取'\n'

#7


引用 5 楼 yinckfire 的回复:
引用 2 楼 zhao4zhong1 的回复:

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

不好意思,我看不懂...都没见过...



百度一下

#8


引用 6 楼 sundayx 的回复:
哦,我看错了,呵呵。最好用插入源代码,那样有格式。
在scanf后加上一个getchar();获取'\n'
插入源代码,代码容易看点

#9


在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin) 原因为scanf的机制,它从来都是从输入缓冲区内读取数据,而不是从键盘!标准输入是从键盘输入到输入缓冲区中。当第一次调用scanf后,除了输入了正确的数据外,我们还输入了回车符,下一次调用scanf,会读取输入缓冲区内的回车符,而不会理睬你从键盘输入的数据(通常输入字符的话,你也输不了,它认为你输过了),所以错误!fflush(stdin)或rewind(stdin) 不过好像这种方法存在移值性问题!gcc 好像就不行!

引用 5 楼 yinckfire 的回复:
引用 2 楼 zhao4zhong1 的回复:

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

不好意思,我看不懂...都没见过...

#1



}else{//缺了个{
  printf("\n\n\t\t字符串:[%s]不是回文!", str);
  printf("\n\n是否继续:1 是; 2 否 \n");
  printf("请选择:");
  scanf("%d", &ch);   
  }

#2


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

#3


这样while也缺少了{,乱拉!

#4


引用 1 楼 sundayx 的回复:
C/C++ code

}else{//缺了个{
  printf("\n\n\t\t字符串:[%s]不是回文!", str);
  printf("\n\n是否继续:1 是; 2 否 \n");
  printf("请选择:");
  scanf("%d", &amp;ch);   
  }


你没仔细看吧!

#5


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

不好意思,我看不懂...都没见过...

#6


哦,我看错了,呵呵。最好用插入源代码,那样有格式。
在scanf后加上一个getchar();获取'\n'

#7


引用 5 楼 yinckfire 的回复:
引用 2 楼 zhao4zhong1 的回复:

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

不好意思,我看不懂...都没见过...



百度一下

#8


引用 6 楼 sundayx 的回复:
哦,我看错了,呵呵。最好用插入源代码,那样有格式。
在scanf后加上一个getchar();获取'\n'
插入源代码,代码容易看点

#9


在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin) 原因为scanf的机制,它从来都是从输入缓冲区内读取数据,而不是从键盘!标准输入是从键盘输入到输入缓冲区中。当第一次调用scanf后,除了输入了正确的数据外,我们还输入了回车符,下一次调用scanf,会读取输入缓冲区内的回车符,而不会理睬你从键盘输入的数据(通常输入字符的话,你也输不了,它认为你输过了),所以错误!fflush(stdin)或rewind(stdin) 不过好像这种方法存在移值性问题!gcc 好像就不行!

引用 5 楼 yinckfire 的回复:
引用 2 楼 zhao4zhong1 的回复:

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

不好意思,我看不懂...都没见过...