〃忝書γě渎ぐ 发表于 2019-11-4 06:41:10

C语言缓冲区问题

#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

jackz007 发表于 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'。最后,键盘缓冲区还剩余一个回车符。这就是本程序从键盘缓冲区读取字符的全过程解析,希望我已经讲明白了。

〃忝書γě渎ぐ 发表于 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;
}

人造人 发表于 2019-11-4 21:24:33

〃忝書γě渎ぐ 发表于 2019-11-4 14:34


输入ab
第6行getchar获取到字符'a'赋值给变量c
第7行输出变量c中存储的字符'a'
第8行getchar获取到字符'b'赋值给变量c,变量c之前保存的是'a',现在用'b'覆盖(替换),也就是现在变量c中存储的是'b'
第9行和第10行输出两次变量c,因为变量c中存储的是'b',所以输出了两次'b'
页: [1]
查看完整版本: C语言缓冲区问题