关于C语言标准缓冲区的总结

在这里插入图片描述

作者 | 学益得智能硬件

一、获取多个数据

1、获取字符串和字符


#include <stdio.h>

int main()
{
    char s1[32] = {0};
    char ch; 

    scanf("%s %c", s1, &ch);

    printf("%s\n", s1);
    printf("%c\n", ch);

    return 0;
}

运行:


root@turbo:~# ./test 
hello c
hello
c
root@turbo:~#

调用scanf函数的时候,%s和%c之间需要空格,输入的时候字符串和字符之间也需要空格隔开。

2、获取字符串和整数

#include <stdio.h>

int main()
{
    char s1[32] = {0};
    int num;

    scanf("%s%d", s1, &num);

    printf("%s\n", s1);
    printf("%d\n", num);

    return 0;
}

运行:


root@turbo:~# ./test 
hello 3
hello
3
root@turbo:~#

调用scanf函数的时候,%s和%d不需要空格,输入的时候字符串和数字需要空格隔开。

3、获取数字和字符

#include <stdio.h>

int main()
{
    char ch;;
    int num;

    scanf("%d%c", &num, &ch);

    printf("%c\n", ch);
    printf("%d\n", num);

    return 0;
}

运行:


root@turbo:~# ./test 
3h
h
3
root@turbo:~#

调用scanf函数,%d和%c没有空格,输入的时候数字和字符间不要有空格。(如果输入的时候数字和字符需要空格隔开,则调用scanf函数的时候%d和%c也需要隔开)

二、多次调用scanf


#include <stdio.h>

int main()
{
    char ch1;
    char ch2;;

    scanf("%c", &ch1);
    scanf("%c", &ch2);

    printf("%c\n", ch1);
    printf("%c\n", ch2);

    return 0;
}

运行:


root@turbo:~# ./test 
h
h


root@turbo:~#

第一次输入字符’h’的时候,因为敲了一下回车,所以标准输入缓冲区同时存入了字符’h’和’\n’,第一个scanf函数获取了字符’h’,第二个scanf函数获取字符’\n’,所以没有得到我们想要的结果。

代码修改如下:


#include <stdio.h>

int main()
{
    char ch1;
    char ch2;;

    scanf("%c", &ch1);
    getchar();
    scanf("%c", &ch2);

    printf("%c\n", ch1);
    printf("%c\n", ch2);

    return 0;
}

运行:

root@turbo:~# ./test 
h
c
h
c
root@turbo:~#

三、标准输出缓冲区

标准输出缓冲区有三种:

  1. 行缓冲;
  2. 全缓冲;
  3. 无缓冲。

调用printf函数输出的数据并没有直接显示在屏幕上,而是先经过标准输出缓冲区。缓冲区遇到三种情况会把数据刷新到屏幕上:

  1. 遇到换行符;
  2. 缓冲区满;
  3. 程序正常退出。

所以在使用printf函数的时候,尽量把’\n’加上。比如:


#include <stdio.h>
#include <unistd.h>

int main()
{
    int i;

    for (i = 0; i < 3; i++)
    {   
        printf("i = %d ", i); 
        sleep(1);
    }   

    return 0;
}

运行:


root@turbo:~# ./test 
i = 0 i = 1 i = 2 root@turbo:~#

3秒后直接全部输出,而不是每隔一秒输出一次。

换行符’\n’起到了刷新缓冲区的作用,数据先是被写入标准输出缓冲区,遇到换行符才被显示到屏幕上,否则只能等到程序正常结束或者缓冲区满才能看到结果。

以上几点是初学者在标准输入输出上常踩的坑,如果还有什么常见问题,欢迎补充。

嵌入式学习课程👇

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值