鱼C论坛

 找回密码
 立即注册
查看: 1217|回复: 4

[已解决]C语言缓冲区问题

[复制链接]
发表于 2019-11-4 06:41:10 | 显示全部楼层 |阅读模式
50鱼币
#include <iostream>

int main()
{
    char c;
    c = getchar();
    putchar(c);
    scanf("%c",&c);//故意输入%d想明白原理
    putchar(c);
    putchar(c);

    //运行后我输入ab,却输出aaa,想知道每一条语句对缓冲区做的操作.
    return 0;
}
最佳答案
2019-11-4 06:41:11
#include <iostream>

int main()
{
    char c;
    c = getchar();
    putchar(c);
    scanf("%d",&c);//故意输入%d想明白原理
    putchar(c);
    putchar(c);

    //运行后我输入ab,却输出aaa,想知道每一条语句对缓冲区做的操作.
    return 0;
}

输入ab
c = getchar();这一行getchar得到的是字符'a',把字符'a'赋值给变量c
scanf("%d",&c);用%d但是得到的是字符'b',scanf不会把字符'b'赋值给变量c,而是直接以失败返回,也就是说这一行完全没有效果,变量c中的内容依然保持着之前的'a'
接下来的两个putchar又输出了两个a,所以输入ab,输出aaa

最佳答案

查看完整内容

输入ab c = getchar();这一行getchar得到的是字符'a',把字符'a'赋值给变量c scanf("%d",&c);用%d但是得到的是字符'b',scanf不会把字符'b'赋值给变量c,而是直接以失败返回,也就是说这一行完全没有效果,变量c中的内容依然保持着之前的'a' 接下来的两个putchar又输出了两个a,所以输入ab,输出aaa
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-4 06:41:11 | 显示全部楼层    本楼为最佳答案   
#include <iostream>

int main()
{
    char c;
    c = getchar();
    putchar(c);
    scanf("%d",&c);//故意输入%d想明白原理
    putchar(c);
    putchar(c);

    //运行后我输入ab,却输出aaa,想知道每一条语句对缓冲区做的操作.
    return 0;
}

输入ab
c = getchar();这一行getchar得到的是字符'a',把字符'a'赋值给变量c
scanf("%d",&c);用%d但是得到的是字符'b',scanf不会把字符'b'赋值给变量c,而是直接以失败返回,也就是说这一行完全没有效果,变量c中的内容依然保持着之前的'a'
接下来的两个putchar又输出了两个a,所以输入ab,输出aaa
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-4 10:10:13 | 显示全部楼层
#include <iostream>

int main()
{
        char c           ;
        c = getchar()    ; // 如果键盘输入 "ab",则 c = 'a'
        putchar(c)       ; // 屏显字符 'a'
        scanf("%c", & c) ; // c = 'b'
        putchar(c)       ; // 屏显字符 'b'
        putchar(c)       ; // 屏显字符 'b'
        return 0         ;
}

        本代码一共有 2 处从键盘读取输入,各读取 1 个字符。当运行至:
        c = getchar()    ; 
时,程序等待键盘输入,用户只有输入字符并按下回车后才会继续到下一条语句。这时,如果用户键入了 "ab" 加回车,那么,在键盘缓冲区中就有了这 3 个字符,getchar() 拿到第 1 个字符 'a',键盘缓冲区内剩余 2 个字符。然后,后面的 scanf() 语句又拿到第 2 个字符 'b'。最后,键盘缓冲区还剩余一个回车符。这就是本程序从键盘缓冲区读取字符的全过程解析,希望我已经讲明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-4 14:34:09 | 显示全部楼层
人造人 发表于 2019-11-4 06:41
输入ab
c = getchar();这一行getchar得到的是字符'a',把字符'a'赋值给变量c
scanf("%d",&c);用%d但 ...
#include <iostream>

int main()
{
    char c;
    c = getchar();
    putchar(c);
    c = getchar();//只要不输入字符b,a就一直在缓冲区吧?
    putchar(c);
    putchar(c);

    //运行后我输入ab,却输出abb。
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-4 21:24:33 | 显示全部楼层

输入ab
第6行getchar获取到字符'a'赋值给变量c
第7行输出变量c中存储的字符'a'
第8行getchar获取到字符'b'赋值给变量c,变量c之前保存的是'a',现在用'b'覆盖(替换),也就是现在变量c中存储的是'b'
第9行和第10行输出两次变量c,因为变量c中存储的是'b',所以输出了两次'b'

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
〃忝書γě渎ぐ + 1 + 1 技术好高,谢谢。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 19:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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