За ваш комментарий для ответа gskspurs , похоже, у вас есть переменное количество строк, разделенных пробелом, во многих строках?
Вам нужно начать с использования fgets
, чтобы получить одну строку, а затем используйте sscanf
, чтобы получить каждое слово по одному, до конца строки (т. Е. До конца строки).
В следующем комментарии вы упомянули, что токен после LIS / MAD описывает, сколько слов следует за ним.Итак, ваша цель состоит в том, чтобы сделать следующее:
- Читать строку, используя
fgets
. - Читать слова "LIS" и "MAD" и делать то, что вам нужноделать с ними (или игнорировать их).(Вы можете использовать
sscanf
) - Используйте
sscanf
, чтобы прочитать целое число, количество слов для подражания.(Давайте назовем это n
для этого обсуждения.) - Используйте
malloc
, чтобы выделить массив строк (тип char **
), количество элементов составляет n
. - Прочитайте слово и сохраните его в массив строк,
n
раз.
Дайте мне знать, если вам нужно разъяснение.
Вот краткий пример:
#define LINE_SIZE 1024
char line[LINE_SIZE]; /* Unfortunately you do need to specify a maximum line size. */
while (fgets(line, LINE_SIZE, stdin) != NULL)
{
/* If we're here, a line was read into the "line" variable. We assume the entire line fits. */
char lis_string[4];
char mad_string[4];
int num_words;
int offset;
char **word_array;
sscanf(line, "%s %s %d %n", lis_string, mad_string, &num_words, &offset);
/* Allocate memory for num_words words */
word_array = malloc(sizeof(*word_array) * num_words);
int i;
for (i = 0; i < num_words; ++i)
{
int chars_read;
/* Allocate space for each word. Assume maximum word length */
word_array[i] = malloc(sizeof(*word_array[i]) * 16);
sscanf(line + offset, "%s %n", num_words[i], &chars_read);
offset += temp;
}
/* Do something with the words we just got, maybe print them or add them to a file */
do_something_with_words(lis_string, mad_string, num_words, word_array);
/* At the end of this loop, lis_string/mad_string/num_words are out of scope, and
will be overwritten in next loop iteration. We need to free up the word_array
to make sure no memory is leaked. */
for (i = 0; i < num_words; ++i)
{
free(word_array[i]);
}
free(word_array);
}