我已经写了下面的代码来按字母顺序对字符串进行排序,我无法理解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
而不是scanf
来做同样的事情时,n-1
单词也会被接受。为甚麽呢?
fgets
是否将最后一个换行符放在n
的th位置?
发布于 2018-08-17 18:39:41
这就是在同一个程序中混合使用fgets
和scanf
调用时会发生的情况。
您首先使用scanf
读取名称的数量。这将读取一个数字,并在输入缓冲区中保留一个换行符。然后,当您进入循环并第一次调用fgets
时,它会立即读取缓冲区中的换行符,然后再次调用fgets
,进入循环的下一次迭代。
当您在循环中使用scanf
时,%s
格式说明符首先读取并丢弃空格字符,其中包括前一次scanf
调用中的换行符。
如果您仍然想使用fgets
,您首先需要在循环之前通过调用getchar
来清除输入缓冲区,直到您读取一个换行符。此外,请记住,fgets
在它读取的字符串中包含换行符。
https://stackoverflow.com/questions/51901112
复制