我在C中编写了一段代码,它迭代了T次,每次都将一首小歌曲的文本作为输入,它将执行一些计数操作(计算每个单词的长度)。现在我只是测试输入是否有效,而不是。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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("<<%s>>\n", song);
,输出为:
3<br>
<< <br>
>> <br>
test <br>
<<test <br>
>> <br>
another test <br>
<<another test <br>
>> <br>
我该如何解决这个问题?如果您有任何建议,欢迎您。
答案 0 :(得分:3)
输入缓冲区中还剩\n
,请参阅http://c-faq.com/stdio/scanfinterlace.html
链接引用:
作为一般规则,您不应该尝试将对scanf的调用交错 调用gets()(或任何其他输入例程); scanf的特殊之处 换行的处理几乎总会导致麻烦。要么使用scanf 阅读一切或全无。
答案 1 :(得分:0)
输入缓冲区中有一个\ n左侧。 一个解决方案是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}