鱼C论坛

 找回密码
 立即注册
查看: 1095|回复: 3

[已解决]关于fgets函数

[复制链接]
发表于 2021-12-14 20:59:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#include<Windows.h>
int main()
{
    char ch1[100]={0};
    char ch2[100]={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-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[100]={0};
    char ch2[100]={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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 21:48:32 | 显示全部楼层
fgets 会连换行符也储存,你的 n 必须包括换行符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[100]={0};
    char ch2[100]={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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-12-21 12:25:35 | 显示全部楼层
本帖最后由 hangfrieddays 于 2021-12-21 12:33 编辑

太感谢你详细的回答了,但我还有两处地方不理解。
1.请问你写的第五行的n\0中的\0是什么意思呀?是不是每次输完数,该数在计算机内存中都会跟着一个\0表示数的结束?
2.为什么读取长度是n+2而不能是n+1呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-9 14:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表