

看一下这一串代码,下面是我的输入,可以看到c[10]存的是'\n',但是此处的'\n'本来是作为b[10]输入的结束的,它为什么会停留在缓冲区呢?而且a[10]输入的结尾用的也是'\n',b[10]为什么没有存入换行啊?我对scanf与fgets的原理有一点不理解,身边也没有书籍共参考,希望解释一下原理与关系


看一下这一串代码,下面是我的输入,可以看到c[10]存的是'\n',但是此处的'\n'本来是作为b[10]输入的结束的,它为什么会停留在缓冲区呢?而且a[10]输入的结尾用的也是'\n',b[10]为什么没有存入换行啊?我对scanf与fgets的原理有一点不理解,身边也没有书籍共参考,希望解释一下原理与关系
因为scanf()读取字符串会忽略换行符,然后输入的换行符会丢弃到缓冲区,接着fgets()会读取丢弃的换行符,就停止继续读取了。
测试代码如下:
参考链接:
https://blog.csdn.net/winter_wu_1998/article/details/77234457
https://blog.csdn.net/Giyuu__/article/details/144188437
https://baike.baidu.com/item/fgets/10942211
#include <stdio.h>
int main(void){
char a[10], b[10], c[10];
int i;
// https://blog.csdn.net/winter_wu_1998/article/details/77234457
// 因为scanf()读取字符串时,会将输入的换行丢弃到缓冲区
scanf("%s", &a);
for(i=0; i<10; i++){
printf("a[%d]=%c,%d\n", i, a[i], a[i]);
}
// 然后第二个scanf()会忽略第一个scanf()丢弃的换行符
// 但是第二次输入的换行符又被丢弃到缓冲区
scanf("%s", &b);
printf("\n");
for(i=0; i<10; i++){
printf("b[%d]=%c,%d\n", i, b[i], b[i]);
}
// https://blog.csdn.net/Giyuu__/article/details/144188437
// https://baike.baidu.com/item/fgets/10942211
// 接着fgets()读取换行符后会停止继续读取,所以fgets()只读取了缓冲区的换行符
// 然后数组c第一个字符就是换行符'\n'
fgets(c, 10, stdin);
printf("\n");
for(i=0; i<10; i++){
printf("c[%d]=%c,%d\n", i, c[i], c[i]);
}
return 0;
}
