| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2567 人关注过本帖
标题:关于回车确认输入的一个问题
只看楼主 加入收藏
孤独的编程者
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
关于回车确认输入的一个问题
  记录一下今天遇到的一个问题,虽然是个很简单的问题,很早就遇到过,无关于算法。但是当时是真不会。
  问题是在《C primer plus 》中文版第五版的198面,是要求可多次输入一个字符,并且通过二维数组的双重循环来打印该字符的字符阵。比如输入为:
A
3 4
那么打印结果的就应该是:
AAAA
AAAA
AAAA
然后继续输入:
B
4 5
那么结果就是:
BBBBB
BBBBB
BBBBB
BBBBB


理论上的代码如下:
#include<stdio.h>
void display(char cr,int lines,int width);
int main()
{
    char ch;
    int rows,cols;
    printf("Enter a character and two integers :\n");
    while((ch=getchar())!='\n')
    {
        scanf("%d %d",&rows,&cols);
  display(ch,rows,cols);
        printf("Enter another character and two integers:\n");
        printf("Enter a newline to quit.\n");
    }
    printf("Bye.\n");
    return 0;
}

void display(char cr,int lines,int width)
{
    int row,col;
    for(row=1;row<=lines;row++)
    {
        for(col=1;col<=width;col++)
            putchar(cr);
        putchar('\n');
    }

}

  在运行的第一次时,是没有出现问题的,但是这个代码运行起来也只能打印一次,然后就因为程序结束而自动关闭。就代码来看,就最外面上的while((ch=getchar())!='\n')这句话来看,只要你最开始输入的要打印的那个字符不是Enter, 程序是是不会运行一次就结束的(PS:Enter貌似也不能打印,它用于清空键盘的缓存区及输入的确认),那么问题处在哪呢?
  由输入来看吧,第一个输入的是要打印的的字符,后来输入的是字符阵的长和宽。在之前的一些时候,我遇到过这种问题,但是不知道那里错了。今天才知道,其实,问题是出在输入的结尾上。第一个while()的结束条件是键入Enter,虽然我们知道自己不会刻意区键入Enter给字符ch, 但是在循环的过程中,我们输入rows和cols后,以按下 Enter确认scanf函数的输入结束。scanf函数会跳过换行符,但是getchar( )并不跳过换行符,所以在循环的下一个周期,我们最后输入的那个Enter被当做while()中的ch输入进去了,这就恰好满足了while()的终止条件,所以程序也就运行一遍就结束了。
  书上给的解决方案是改是这样的的,代码也敲下来看看:
  
  #include<stdio.h>
  void display(char cr,int lines,int width);
  int main()
  {
      char ch;
      int rows,cols;
      printf("Enter a character and two integers :\n");
      while((ch=getchar())!='\n')
      {
          if(scanf("%d %d",&rows,&cols)!=2);
              break;
          display(ch,rows,cols);
          while(getchar()!='\n')
              continue;
          printf("Enter another character and two integers:\n");
          printf("Enter a newline to quit.\n");
  
      }
      printf("Bye.\n");
      return 0;
  }
  
  void display(char cr,int lines,int width)
  {
      int row,col;
      for(row=1;row<=lines;row++)
      {
          for(col=1;col<=width;col++)
              putchar(cr);
          putchar('\n');
      }
  
  }
  
  书上的这段代码是在输入的时候检查scanf的返回值和getchar 的值来控制的,在VC环境下运行的时候,结果和第一种是一样的,从代码的扩及上来说,不应该是这样的结果的。这一点我不知道是社么原因。如果有兴趣的化,可以帮我解决一下这个问题。而当把break这一句删了之后,运行就可以多次打印不同的字符阵了。用完全相反的办法可以解决问题,这个我很困惑。也可能因为这段代码的输入用的是文件而不是不是用的键盘吧。怪我技术太垃圾,反正我是不懂了。
  我的解决办法是这样的,在第一个代码的scanf("%d %d",&rows,&cols);这句话后面加一句话,加一个getchar();作用是把最后确认scanf函数结束的那个回车给消掉,这样一来,在下一次的循环中,上次的敲的回车就不在输入队列中了。
 
  
搜索更多相关主题的帖子: 中文版 include display 
2013-05-03 09:07
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:4 
空白符。。。
程序代码:
#include <stdio.h>

int main()
{
    char ch;
    int i, j, m, n;

    while (scanf(" %c ", &ch) == 1)
    {
        scanf("%d %d", &m, &n);
        for (i = 0;i < m;++i, puts(""))
        for (j = 0;j < n;++j)
            putchar(ch);
    }
    
    return 0;
}


[fly]存在即是合理[/fly]
2013-05-03 09:20
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:4 
这个貌似不需要你那么麻烦吧,楼上的就很简单

三十年河东,三十年河西,莫欺少年穷!
2013-05-03 09:22
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:4 
不需要那么麻烦,可能是为了演示某中用途吧

Maybe
2013-05-03 10:01
hczsea
Rank: 2
等 级:论坛游民
帖 子:129
专家分:68
注 册:2007-10-23
收藏
得分:4 
去掉上次输入的回车的话,可以用fflush(stdin);代替while(getchar()!='\n') continue;
2013-05-03 13:45
hczsea
Rank: 2
等 级:论坛游民
帖 子:129
专家分:68
注 册:2007-10-23
收藏
得分:0 
#include <stdio.h>
void display(char cr,int lines,int width);
int main()
{
    char ch;
    int rows,cols;

    printf("Enter a character and two integers :\n");
    while((ch=getchar())!='\n')
    {
        scanf("%d %d",&rows,&cols);
        display(ch,rows,cols);
        fflush(stdin);
        printf("Enter another character and two integers:\n");
        printf("Enter a newline to quit.\n");
    }

    printf("Bye.\n");
    return 0;
}

void display(char cr,int lines,int width)
{
    int row,col;

    for(row=1;row<=lines;row++)
    {
        for(col=1;col<=width;col++)
            putchar(cr);
        putchar('\n');
    }
}
2013-05-03 13:45
快速回复:关于回车确认输入的一个问题
数据加载中...
 
   



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

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