51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2019|回复: 12
打印 上一主题 下一主题

【求助】关于c语言中scanf的一个问题

[复制链接]
  • TA的每日心情
    慵懒
    2020-8-11 08:18
  • 签到天数: 114 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2007-12-4 22:16:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    今天帮同学调试程序时发现一个问题
    类似代码如下:(源程序太长不高兴贴了  )
    #include "stdio.h"
    int main(int argc,char *argv[]) {
    int i;
    for (i = 0; i < 5; i++) {
        char c;
        scanf ("%c",&c);
        printf("para%d=%c\n",i,c);
        printf("*********\n");
    }
    return 0;
    }
    执行结果比较奇怪
    当时我的第一反应是scanf的时候由于输入完一个字符按了回车,可能接收了不止一个字符
    于是改成了scanf(" %c",&c);程序可以正常执行
    然后我就想
    既然scanf里的第一个字符串是对格式的约定
    那么能不能用scanf("%c\n",&c);呢
    试了一下发觉居然不行
    很郁闷的上网找了下资料
    有一个解决办法是在scanf后加一句清空缓存的语句:fflush(stdin);
    这样是没问题的

    但是我还是想不明白
    1 为什么scaf("%c\n",&c); 执行会不正常呢?
    (网上查到的解释是:
    “用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d  ",&a)也会出现同样的问题。”
    那如果这样的话,我用scaf("%ca",&c);为什么还是不行。。。)
    2 在console状态中按回车键,究竟是回车还是回车+换行?(文本状态下肯定是回车+换行)
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    该用户从未签到

    13#
    发表于 2008-1-9 23:10:42 | 只看该作者
    原因应该就是第二次scanf把上次的回车给接收了吧。建议把比较奇怪的结果发上来看看就更好分析了

    [ 本帖最后由 123czq 于 2008-1-9 23:12 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
    发表于 2008-1-9 21:38:14 | 只看该作者
    顶大熊。。。。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
    发表于 2007-12-12 15:42:05 | 只看该作者
    学习了,最好什么方式简单用什么,用最简单的方式解决问题~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-8-11 08:18
  • 签到天数: 114 天

    连续签到: 1 天

    [LV.6]测试旅长

    10#
     楼主| 发表于 2007-12-12 07:28:45 | 只看该作者
    自己顶一下。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2007-12-10 21:55:43 | 只看该作者
    看看了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-8-11 08:18
  • 签到天数: 114 天

    连续签到: 1 天

    [LV.6]测试旅长

    8#
     楼主| 发表于 2007-12-6 22:18:36 | 只看该作者
    谢谢ls的回复
    不过我问的不是解决方案

    原帖由 puchonghui 于 2007-12-4 22:16 发表
    但是我还是想不明白
    1 为什么scaf("%c\n",&c); 执行会不正常呢?
    (网上查到的解释是:
    “用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d  ",&a)也会出现同样的问题。”
    那如果这样的话,我用scaf("%ca",&c);为什么还是不行。。。)
    2 在console状态中按回车键,究竟是回车还是回车+换行?(文本状态下肯定是回车+换行)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
    发表于 2007-12-6 21:59:31 | 只看该作者

    关于scanf 问题的回复

    关于这个scanf输入的问题有两个解决的方法如下:
    方法一:
    #include "stdio.h"
    int main(int argc,char *argv[])
    {
        int i;
        for (i = 0; i < 5; i++) {
        char c;
        scanf ("%c",&c);
        getchar();//吃掉回车符
        printf("para%d=%c\n",i,c);
        printf("*********\n");
        }
        return 0;
    }

    方法二:
    #include "stdio.h"
    int main(int argc,char *argv[])
    {
        int i;
        for (i = 0; i < 5; i++) {
        char c;
        fflush(stdin);//清空输入缓冲区
        scanf ("%c",&c);
        printf("para%d=%c\n",i,c);
        printf("*********\n");
            }
        return 0;
    }

    因为你在输入时其实你是输入了两个字符。
    一个是你想输入的字符,别一个是你的回车符。
    它也要算一个字符,但它是不可见的字符。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
    发表于 2007-12-6 20:16:25 | 只看该作者
    我又找到个办法,既用scanf,又不用fflush
    只要把
    scanf("%c",&c");
    改成
    scanf("%1s",&c");
    就可以了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-8-11 08:18
  • 签到天数: 114 天

    连续签到: 1 天

    [LV.6]测试旅长

    5#
     楼主| 发表于 2007-12-5 16:58:20 | 只看该作者
    。。。
    我不是要解决方案
    解决方案我自己都写了。。。

    我是要谁给我个解释
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
    发表于 2007-12-5 13:36:49 | 只看该作者
    忘记说了,如果不要回显字符的话,就用getch()可以了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3#
    发表于 2007-12-5 13:32:38 | 只看该作者

    scanf ("%c",&c);
    这句改成
    c=getch();
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2#
    发表于 2007-12-5 00:21:21 | 只看该作者
    你这个我也遇到过,而且自己解决过,也分析过,不过很久米有关注这个,差不多忘光了当初是怎么明白的,汗一下,说了一堆废话,但还是有点儿作用,就是帮你顶了一下……

    没有功劳也有我顶你的苦劳啊,也看看我敲了这么多字儿的份儿……
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-28 07:58 , Processed in 0.076601 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表