gpt4 book ai didi

c - fgets 如何对待\n?

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:59 25 4
gpt4 key购买 nike

我写了下面的代码来按字母顺序对字符串进行排序。但是我无法理解 fgets 在这里是如何工作的。

#include<stdio.h>
#include<string.h>
int main()
{
char s[10][15];
int n;
printf("enter the no of names\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
fgets(s[i],15,stdin);
//scanf("%s",s[i]);
}
for(int i=1;i<n;i++)
{
for(int j=0;j<n-i;j++)
if(strcmp(s[j],s[j+1])>0)
{
char g[15];
strcpy(g,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],g);
}
}
printf("the sorted strings are");
for(int i=0;i<n;i++)
printf("%s",s[i]);
return 0;
}

如果我使用 scanf 而不是 fgets 来接受字符串,n 字会被接受但是当我使用 fgets 用于相同目的而不是 scanfn-1 单词被接受。为什么会这样?

fgets 是否将最后一个换行符放在第 n 位置?

最佳答案

当您在同一个程序中混合调用 fgetsscanf 时会发生这种情况。

您开始使用 scanf 来读取名称的数量。这会读取一个数字并在输入缓冲区中留下一个换行符。当您进入循环并第一次调用 fgets 时,它会立即读取缓冲区中的换行符,然后进入循环的下一次迭代,再次调用 fgets .

当您在循环中使用 scanf 时,%s 格式说明符首先读取并丢弃空白字符,其中包括先前 scanf 中的换行符 调用。

如果您仍然想使用 fgets,您首先需要通过调用 getchar 来在循环之前清除输入缓冲区,直到您读取到换行符。另外,请记住 fgets 在它读取的字符串中包含换行符。

关于c - fgets 如何对待\n?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51901112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com