C程序读取和存储字符串

时间:2015-04-05 00:47:05

标签: c

我在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>

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

2 个答案:

答案 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;
}

另见: How to clear input buffer in C?