| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2889 人关注过本帖
标题:运行时为什么会直接跳过d=getchar();执行下一条语句?
只看楼主 加入收藏
continue24
Rank: 2
等 级:论坛游民
帖 子:38
专家分:96
注 册:2012-11-16
结帖率:80%
收藏
已结贴  问题点数:40 回复次数:8 
运行时为什么会直接跳过d=getchar();执行下一条语句?
题目描述
回文数:即反转后与本身相等的数,请编写一个程序求出区间内的回文数
PS:注意是开区间还是闭区间
输入
第一行为一个整数N,表示下面有N组测试数据
每组测试数据格式为[a,b]{a<=x<=b}或者(a,b){a<x<b}
输出
对于每组测试数据,输出该区间内有多少回文数
样例输入
2
[111,111]
(111,111)
样例输出
1
0
这道题我完全没有思路,不会输入[111,111]
                              (111,111)
在同学的指导下勉强写了一下,可是完全不对,运行时不知道为什么直接跳过了d=getchar();以下是我写的程序,大家帮忙看看,提点意见或者思路吧,谢谢!


#include<stdio.h>
#include<string.h>
int main()
{
    int a,b,g,i=0,sum=0,p,sune=0,s=0;//a和b是例子里的111和111,sum是用来记录比较了多少数组sum[]中的元素,sune是用来记录回文数个数的,s是用来控制输入的组数的//
    char d,k,min[500]={1,2};
    scanf("%d",&g);//输入组数//
    for(s=0;s<g;s++)
    {
        d=getchar();//输入“[”或者“(” 的//
        scanf("%d,%d",&a,&b);
         k=getchar();//输入“[”或者“(” 的,与上面的对应//
         p=a;
        if(d=='[')//判断是闭区间还是开区间//
        {
            while(a<=b)
            {
                while(p>0)
                {
                   min[i]=p%10;
                   p=p/10;
                   i++;
                }//将整数a分解后依次存入数组min中//
                for(i=0;i<strlen(min);i++)
                {
                    if(min[i]==min[strlen(min)-i])
                        sum++;
                    if(2*sum>=strlen(min))
                        sune++;
                }//判断是否为回文数//
                a++;
            }
        
            printf("%d",sune);
        }
        if(d=='(')
        {
            p++;
            while(a<b)
            {
                  while(a>0)
                  {
                    min[i]=p%10;
                    p=p/10;
                    i++;
                  }//将整数a分解后依次存入数组min中//
            
                  for(i=0;i<strlen(min);i++)
                  {
                    if(min[i]==min[strlen(min)-i])
                         sum++;
                    if(2*sum>=strlen(min))
                         sune++;
                  }//判断是否为回文数//
                a++;
        
            }
            printf("%d",sune);
        }
    }
    return 0;
        }
        
搜索更多相关主题的帖子: 测试 
2012-12-06 19:02
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:0 
原因是scanf()读取缓冲中的数据时,只读取数据而把最后面的'\n'留在缓冲队列中,下面一条getchar()读取的就是'\n',你就感觉到getchar()不起作用,你可以用两个getcahr(),或者用scanf() %c说明。
2012-12-06 20:05
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:15 
原因是scanf()读取缓冲中的数据时,只读取数据而把最后面的'\n'留在缓冲队列中,下面一条getchar()读取的就是'\n',你就感觉到getchar()不起作用,你可以用两个getcahr(),或者用scanf() %c说明。
2012-12-06 20:05
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
类似的问题每隔几天就会有人问的,scanf—很麻烦的函数啊

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-06 20:12
引脚片段
Rank: 2
等 级:论坛游民
帖 子:41
专家分:29
注 册:2012-11-21
收藏
得分:0 
赞同楼上
2012-12-06 22:16
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
我尝试着写了一下,测试是通过了
程序代码:
#include<math.h>
#include<stdio.h>
int huiwen(int a){      //做一个判断回文的函数
    int p,i,j,c;
    char b[10]={'\0'};
    char d[10]={'\0'};    //把字符数组用'\0'初始化
    p=a;
    c=a;
    for(i=0;;i++){
    for(j=0;p>10;j++)
       p=p/10;  
     b[i]=p;
     c=c-p*pow(10,j);
     p=c;
     if(p<10)break;}//把数字的每一位分别放入数组
     b[++i]=p;  //把最后一次循环的结果放入数组
    for(j=0;i>=0;)
      d[j++]=b[i--];  //用数组b给d赋值
     for(j=0;b[j]!='\0';j++)
      if(b[j]!=d[j])return 0;//判断是否回文
    return 1;
    }
main(){
    int k,i,sum=0,x,p,q;
    int a[10],b[10];
    char m[10],n[10];//将每行输入内容保留
    fflush(stdin);
    scanf("%d",&k);
    for(i=0;i<k;i++){
     fflush(stdin);//清理缓存
     scanf("%c%d,%d%c",&m[i],&a[i],&b[i],&n[i]);
     }
    for(i=0;i<k;i++){
      if(m[i]=='[')
        if(n[i]==']')
          for(x=a[i];x<=b[i];x++)
            {if(huiwen(x)==1)sum++;}
        else if(n[i]==')')
          for(x=a[i];x<b[i];x++)
            {if(huiwen(x)==1)sum++;}
        else {printf("error line:%d\n ",i+1);continue;}//判断是否有输入错误
      else if(m[i]=='(')
         if(n[i]==']')
           for(x=a[i]+1;x<=b[i];x++)
             {if(huiwen(x)==1)sum++;}
         else if(n[i]==')')
           for(x=a[i]+1;x<b[i];x++)
             {if(huiwen(x)==1)sum++;}
         else{ printf("error line:%d\n",i+1);continue;}
      else {printf("error line:%d\n",i+1);continue;}
      printf("%d\n",sum);
      sum=0;
      }
      return;
      }
           
随便乱写的哈,欢迎大家指正。。。。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-06 23:00
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
都用getchar多方便

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-12-07 19:07
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:20 
程序代码:
 for(s=0;s<g;s++)
    {
        d=getchar();//输入“[”或者“(” 的//
        scanf("%d,%d",&a,&b);
         k=getchar();//输入“[”或者“(” 的,与上面的对应//
         p=a;
中scanf函数在结束输入的时候会代入一个'\n'换行符(当你按下回车键的时侯),但是和gets那一类函数不同的是
它会把'\n'从要输入的变量(当然也包括常量...)拿出来但同时却又不删除它,而是把它留在了输入缓冲区中,所以后面的getchar()就会从缓冲区中拿出一个字符也就是'\n'来,因为它只是拿一个字符,所以拿完就结束了。

可以使用fflush(stdin);来清空缓冲区,但这在gcc下是不允许的,如果要考虑到它的可移植性的话可以这么写:
程序代码:
for(s=0;s<g;s++)
    {
        d=getchar();//输入“[”或者“(” 的//
        scanf("%d,%d",&a,&b);
     while(getchar() != '\n');  //如果检测到缓冲区内的字符是'\n'就结束抽取,因为需要保证下一个输入不会直接跳过,所以做个循环可以把用户输入多于的字符也清除掉
         k=getchar();//输入“[”或者“(” 的,与上面的对应//
         p=a;



I have not failed completely
2012-12-07 21:00
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:5 
回复 楼主 continue24
支持2楼的说法,另外虽然用了getchar,但是要赋值的左边变量需要定义呀
2012-12-07 21:38
快速回复:运行时为什么会直接跳过d=getchar();执行下一条语句?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026076 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved