fgets()没有扫描我想要的字符串数量

时间:2016-01-28 19:36:38

标签: c arrays string char fgets

我有一系列句子,我想先用fgets()扫描它们,然后逐个打印。这是程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>





int main(int argc,char *argv[]) {

    char sentence[100][100]; /* 100 sentences with at most 100 characters*/
    int n,i,j;

    scanf("%d",&n); /* number of sentences*/

    for (i=0;i<n;i++) {
        fgets(sentence[i],100,stdin);
    }
    printf("****************************");
    for (i=0;i<n;i++) {
        for(j=0;j<strlen(sentence[i]);j++) {
            putchar(sentence[i][j]);
        }

    }


    return 0;
}

问题是这只能扫描n-1个句子。这是为什么?

另一个奇怪的事情是,在打印星号之后,它开始在新行上打印,而我没有告诉它这样做。

3 个答案:

答案 0 :(得分:1)

假设输入是

3
abc
def
ghi

扫描n后,光标停留在第一行的数字3之后。

您可以在%d之后添加空格,例如scanf("%d ", &n);,将光标移动到下一行。 (这假设第一句不以空格开头)。

取决于您的环境是否(Windows / Unix),以及您是否希望每个字符串都保留行尾字符,您需要将缓冲区大小增加到:

  • 101 - 对于Unix行结束,你可以丢弃长度为100个字符的行尾字符
  • 102 - 对于Windows行结尾,您可以放弃100个字符长的句子的行尾字符
  • 102 - 对于Unix行结尾,你想保留所有句子的行尾字符
  • 103 - 对于Windows行结尾,您希望保留所有句子的行尾字符

例如,如果您错误地将101用于Windows,则输入以下内容

0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789

输出结果为:

0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789


0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789


0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789

(有一些空行)

答案 1 :(得分:1)

两个案例都将由一个概念解决,fgets()newline视为输入的一部分。

问题1:

输入缓冲区中有一个newline(由于第一次输入后按下ENTER键),紧接着是下一个fgets()

解决问题1:

使用

  scanf("%d%*c",&n);   //simple solution

 scanf("%d",&n);
 while (getchar() != '\n');  //eat up anything upto newline

清除尾随换行符。

问题2:

fgets()扫描并存储newline作为输入的每个。如果您不希望换行符作为输入的一部分,则需要手动检查并删除换行符。

手册页中的相关引用:

  

[...]如果读取换行符,则将其存储到缓冲区中。 [...]

解决问题2:

  sentence[strcspn(sentence, "\r\n")] = 0;

感谢@chux,更多关于此here

答案 2 :(得分:0)

您是否阅读了fgets的手册页?

fgets() 从流中读取最多一个小于大小的字符 ,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节('\ 0')存储在缓冲区中的最后一个字符之后。

所以你的代码应该是chux所指出的:

fgets(sentence[i],sizeof sentence[i],stdin);