在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,换行