个人理解—行缓冲与scanf()

        在Linux系统中,默认为行缓冲,也就是当一行代码准备完成的情况下进行输出。依据这一个特性可以使用printf()来判断段错误的地方出现在哪里。

xxxxxx
printf("xxxx");无\n
xxxxx   在这里出现段错误,由于上面的输出没有\n则表示没有完成一行的准备。所以这里的printf()不会进行输出,所以:


xxxxxx
printf("xxxx\n");
xxxxx   在这里出现段错误,上面的printf有换行符号,表示一行已经结束,则下面的代码出现段错误时不会对其进行影响,由此可以借用printf()来判断段错误发生的地方。

调用硬件输出一行的依据为:\n

linux系统中为\n,windows系统中为\r\n

        scanf()在linux和windows的区别。在windows中使用scanf时,要一次性输入多个数据时,输入为1,2,3但是在linux中与windows输入方式是不同的。

xxxxxxxx
scanf("%d,%d,%d", &a, &b, &c);
printf("%x,%x,%x\n", a, b, c);
xxxxxxxx

        在window中可以按照1空格2空格3的方式进行数据输入,printf输出时候为1,2,3。但是在linux系统中使用如上方式输入是错误的。

xxxxxxxx
scanf("%d,%d,%d", &a, &b, &c); 输入1空格2空格3
printf("%x,%x,%x\n", a, b, c);输出 1,b77e7000,80484fb
xxxxxxxx

        其原因在于linux中scanf的接收格式与windows不同,在linux中的接收格式为1逗号2逗号3。

xxxxxxxx
scanf("%d,%d,%d", &a, &b, &c); 输入1逗号2逗号3
printf("%x,%x,%x\n", a, b, c);输出 1,2,3
xxxxxxxx

        为什么上面使用错误格式接收输入1空格2空格3的数据后会出现乱码呢,原因还是在于linux默认为行缓冲以及接收格式的不同,我们来看如下的代码。

 int a,b,c,d;

scanf("%d,%d,%d", &a, &b, &c); 输入1空格2空格3
printf("%d,%d,%d\n", a, b, c);输出 1,-1217265664,134513963
scanf("%d", &d);无输入
printf("%d\n",d);输出2
scanf("%d", &d);无输入
printf("%d\n",d);输出3

        用户输入三个数后用回车结束,由于格式不对,所以只有1被第一个scanf截取,后面的2 3会保留在缓冲区,被后面的scanf依次取走。

        根据上面scanf的特性,我们思考一个问题,scanf是最后接收到的回车去哪里了,答案是保存在了缓冲区。这就引发出了其书写的标准化,按照如下的格式进行书写是用一个单独的scanf("%c",c)或者一个getchar()去接收回车符。否则这个回车会存储到下一次输入字符数据接收时占位,形成“吞字符的现象”,这个现象在单片机中尤为明显。

char a,b,c,d;
scanf("%c,%c,%c", &a, &b, &c); 输入a,b,c换行
scanf("%c", &d);
printf("%c,%c,%c,%c\n", a, b, c,d);输出a,b,c,换行  由此证明了在输入数据时回车确实是被存储了的


char a,b,c,d;
scanf("%c,%c,%c", &a, &b, &c); 输入a,b,c换行
d=getchar();
printf("%c,%c,%c,%c\n", a, b, c,d);输出a,b,c,换行

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值