我已经编写了以下代码来按字母顺序对字符串进行排序。但是我无法理解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
个单词,但是当我出于相同目的而不是{{1}来使用fgets
时},scanf
个单词被接受。为什么会这样?
n-1
是否将最后一个换行符放在第fgets
位?
答案 0 :(得分:3)
这是在同一程序中混合使用fgets
和scanf
调用时发生的情况。
您首先使用scanf
读取名称的数量。这将读取一个数字,并在输入缓冲区中留下换行符。然后,当您进入循环并首次调用fgets
时,它将立即读取缓冲区中的换行符,然后转到循环的下一个迭代,再次调用fgets
。
当您在循环中使用scanf
时,%s
格式说明符将首先读取和丢弃空格字符,其中包括来自先前scanf
调用的换行符。
如果您仍然想使用fgets
,则首先需要在循环之前通过调用getchar
清除输入缓冲区,直到您读取换行符为止。另外,请记住,fgets
在其读取的字符串中包含换行符。