关于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数组无法输入了? fgets 会连换行符也储存,你的 n 必须包括换行符 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:33 编辑
太感谢你详细的回答了,但我还有两处地方不理解。
1.请问你写的第五行的n\0中的\0是什么意思呀?是不是每次输完数,该数在计算机内存中都会跟着一个\0表示数的结束?
2.为什么读取长度是n+2而不能是n+1呢?
页:
[1]