〃忝書γě渎ぐ 发表于 2019-11-4 15:49:17

C语言标准中缓冲区定义是什么?

#include <stdio.h>

int main()
{
    char c;
    int i;

    scanf("%d",&i);
    c = getchar();
    putchar(c);
    printf("%d",i);
    printf("%d",i);
    //运行后我输入1a,却输出a11
    //1.字符和int型变量占用的不是同一块缓冲区?还是能区分变量类型?
    //2.只要不输入新的数据,字符缓冲区只保留最后一个字符变量?

    return 0;
}

jackz007 发表于 2019-11-4 15:49:18

本帖最后由 jackz007 于 2019-11-4 18:08 编辑

#include <stdio.h>

int main()
{
      char c                ;
      int d , i             ;
      d = scanf("%d" , & i) ; // 键入 "1a" 回车,则键盘缓冲区中有 3 个字符:'1'、'a'、'\n',scanf() 拿到 '1',所以,i = 1
      c = getchar()         ; // 键盘缓冲区剩下 2 个字符:'a'、'\n',getchar() 拿到 'a',所以,c = 'a'
      putchar(c)            ; // 把字符 'a' 输出到屏幕上
      printf("%d" , i)      ; // 把数字 1 输出到屏幕上
      printf("%d" , i)      ; // 把数字 1 输出到屏幕上
                              // 所以,最后屏幕上看到的就是 "a11"
}

       键盘缓冲区只是保留从键盘输入的字符,统统是字符类型,至于和变量类型的关系,C 语言有相应的函数,比如,getchar()、scanf() 等等,可以把这些字符转化成需要的数据类型。
       如果没有键盘输入,键盘缓冲区一般都是空的。

扼言abc 发表于 2019-11-4 20:29:33

1.scanf函数声明:int scanf( format string , arg1 , arg2 , ...);
从函数声明可以看到,scanf 的参数由指示读取动作的格式化字符串( format string )和相应的地址参数 arg1...argn 组成。scanf 函数将输入从标准输入缓冲区 stdin 中读入,并将它们以格式化字符串中指定的格式存储到额外的参数 arg1...arg2 等指定的内存空间中。其中额外的参数(additional argument)指向的内存空间的数据类型应该与格式化字符串中指定的数据类型相一致。
2.getchar 从标准输入中读取数据,而 stdin 是采用行缓冲的方式记录用户输入,也就是只有当用户键入回车键或输入至缓冲区末尾时,才会开始 I\O 操作,亦即读取一个字符。这样用户可以一次输入不止一个字符,读取过后缓冲区可能不为空。当再次调用 getchar 时,若缓冲区不为空,getchar 就会直接读取在缓冲区中字符,而不是等待用户输入。可以认为是getchar 等待的是行缓冲的完成,而不是用户输入的完成,在行缓冲完成后,只要缓冲区不为空,getchar 就可以读取字符,而不需要等待用户输入.
页: [1]
查看完整版本: C语言标准中缓冲区定义是什么?