鱼C论坛

 找回密码
 立即注册
查看: 1135|回复: 2

[已解决]C语言标准中缓冲区定义是什么?

[复制链接]
发表于 2019-11-4 15:49:17 | 显示全部楼层 |阅读模式
30鱼币
#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;
}

最佳答案
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() 等等,可以把这些字符转化成需要的数据类型。
       如果没有键盘输入,键盘缓冲区一般都是空的。

最佳答案

查看完整内容

键盘缓冲区只是保留从键盘输入的字符,统统是字符类型,至于和变量类型的关系,C 语言有相应的函数,比如,getchar()、scanf() 等等,可以把这些字符转化成需要的数据类型。 如果没有键盘输入,键盘缓冲区一般都是空的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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() 等等,可以把这些字符转化成需要的数据类型。
       如果没有键盘输入,键盘缓冲区一般都是空的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 就可以读取字符,而不需要等待用户输入.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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