fgets如何对待\ n?

时间:2018-08-17 18:33:14

标签: c string fgets

我已经编写了以下代码来按字母顺序对字符串进行排序。但是我无法理解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位?

1 个答案:

答案 0 :(得分:3)

这是在同一程序中混合使用fgetsscanf调用时发生的情况。

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

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

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