hangfrieddays 发表于 2021-12-14 20:59:30

关于fgets函数

#include <stdio.h>
#include <stdlib.h>
#include<Windows.h>
int main()
{
    char ch1={0};
    char ch2={0};
    int n;
    printf("请输入要输入的个数:");
    scanf("%d",&n);
    fgets(ch1,n,stdin);
    fgets(ch2,n,stdin);
    char *ptr1=ch1;
    char *ptr2=ch2;
    char*ptr=ptr1;
    while(*ptr1++==*ptr2++&&*ptr1);
    if(ptr1-ptr==strlen(ch1))
      printf("一样");
    else
      printf("不一样");
}


请问这样写为什么ch2数组无法输入了?

傻眼貓咪 发表于 2021-12-14 21:48:32

fgets 会连换行符也储存,你的 n 必须包括换行符

如来神掌 发表于 2021-12-17 17:12:17

2#楼大佬说的意思是:在数据输入缓冲区中,当你使用scanf接收数据n,在按下回车键后,会有一个'\n'换行符留在缓冲区中,这个换行符会在第一次使用fgets时作为结束符号被接收了,相当于第一个字符串是空的,而你接下来输入的字符串会作为字符串2的内容:
scanf:遇到\0停止读取,不包含换行符
fgets:遇到换行符停止读取,包含换行符
输入n的值(缓冲区:n\0)->按下回车(缓冲区:n\0\n)->scanf读取(把n读取掉了,缓冲区:\n)->fgets(将换行符\n当做一个没有任何元素的空字符串读取掉了,缓冲区:)->继续输入(缓冲区:字符串)->按下回车(缓冲区:字符串\n)->fgets(将换行符\n以及字符串一起读取掉了,缓冲区:)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char ch1={0};
    char ch2={0};
    int n;

    printf("请输入要输入的个数:");
    scanf("%d",&n);

    getchar();//关键在这里,将还留存在缓冲区的换行符读取掉,避免干扰后续的fgets读取

    fgets(ch1,n+2,stdin);
    fgets(ch2,n+2,stdin);
   
    char *ptr1=ch1;
    char *ptr2=ch2;
    char*ptr=ptr1;
    while(*ptr1++==*ptr2++&&*ptr1);
    if(ptr1-ptr==strlen(ch1))
      printf("一样\n");
    else
      printf("不一样\n");
   
    return 0;
}

hangfrieddays 发表于 2021-12-21 12:25:35

本帖最后由 hangfrieddays 于 2021-12-21 12:33 编辑

太感谢你详细的回答了,但我还有两处地方不理解。
1.请问你写的第五行的n\0中的\0是什么意思呀?是不是每次输完数,该数在计算机内存中都会跟着一个\0表示数的结束?
2.为什么读取长度是n+2而不能是n+1呢?
页: [1]
查看完整版本: 关于fgets函数