Я пишу кусок кода в C, который выполняет итерацию T раз и каждый раз берет в качестве ввода текст небольшой песни, на которой он будет выполнять некоторую операцию подсчета (считая длину каждого слово). Пока я просто проверяю, работает ли вход, а это не так.C программа для чтения и хранения строк
#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":
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>
Как я могу решить эту проблему? Если у вас есть ANY совет приветствуется.
новой строки после 3 остается в буфере в ожидании первых 'fgets()', чтобы прочитать его. Перед запуском вызовов на 'fgets()' вам нужно прочитать до конца первой строки, номер с номером на ней. Например: 'int c; while ((c = getchar())! = EOF && c! = '\ n'); 'будет работать нормально. Вы должны проверить возвращаемое значение из 'fgets()' тоже, если вы столкнулись с EOF до того, как T-строки были прочитаны. В конце концов, вы избавитесь от T и просто попросите компьютер подсчитать строки - компьютеры хороши в подсчете. Вы можете отладить это с помощью печати: 'printf (" <<%s>> \ n ", песня);' поможет. –
Обратите внимание, что вы можете использовать статически выделенный буфер, поскольку вы передаете фиксированный размер в 'malloc' в любом случае. – Diego
@JonathanLeffler: Я добавил в главный пост, как он печатает с вашим отладочным трюком – Ice