W2126 2025-12-19 13:59 采纳率: 100%
浏览 9
已结题

scanf与fgets在的用法

img

img

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

  • 写回答

1条回答 默认 最新

  • a5156520 2025-12-19 14:54
    关注

    因为scanf()读取字符串会忽略换行符,然后输入的换行符会丢弃到缓冲区,接着fgets()会读取丢弃的换行符,就停止继续读取了。

    测试代码如下:

    参考链接:



    #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; 
        
    } 
     
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月31日
  • 已采纳回答 12月23日
  • 修改了问题 12月19日
  • 创建了问题 12月19日