C程序读取和存储字符串

我在C中编写了一段代码,它迭代了T次,每次都将一首小歌曲​​的文本作为输入,它将执行一些计数操作(计算每个单词的长度)。 现在我只是测试输入是否有效,而不是。

#include  #include  #include  #define MAX_SONG_SIZE 501 int main(void){ int T; scanf("%d", &T); while(T--){ char* song = malloc(MAX_SONG_SIZE); if(song == NULL){ printf("malloc failed"); return 1; } fgets(song, MAX_SONG_SIZE, stdin); printf("foo\n"); free(song); } return 0; } 

我正在使用fgets()因为单词之间的空格和动态内存分配,因为我不能只为所有歌曲使用一个数组,前一次迭代中的字符将保留在数组中。

但是有一个问题。 它在第一次迭代中跳过fgets() ,只写“foo”而不等我插入字符串。

这是一个如何使用初始输入“3”进行打印的示例:
3
FOO
这是一个测试
FOO
另一个测试
FOO


替换printf("foo\n");printf("<>\n", song); 输出是这样的:

 3
<<
>>
test
<<test
>>
another test
<<another test
>>

我怎么解决这个问题? 如果您有任何建议,欢迎您。

输入缓冲区中有一个\n ,请参阅http://c-faq.com/stdio/scanfinterlace.html

链接引用:

作为一般规则,您不应尝试通过调用gets()(或任何其他输入例程)来交换对scanf的调用; scanf对换行的特殊处理几乎总会导致麻烦。 使用scanf读取所有内容或不读取任何内容。

输入缓冲区中有一个\ n左侧。 一个解决方案是:

 #include  #include  #include  #define MAX_SONG_SIZE 501 int main(void){ int t; scanf("%d", &t); getchar(); char song[MAX_SONG_SIZE]; while(t--){ fgets(song, MAX_SONG_SIZE * sizeof(char), stdin); printf("foo\n"); } return 0; } 

另请参见: 如何清除C中的输入缓冲区?