strtok () C-струны в массив - PullRequest
       81

strtok () C-струны в массив

0 голосов
/ 14 сентября 2018

В настоящее время изучаю C, возникли проблемы с передачей токенов c-string в массив.Строки поступают с помощью стандартного ввода, strtok используется для разбиения строки, и я хочу правильно поместить каждую в массив.проверка EOF необходима для выхода из входного потока.Вот что я сделал, настроил так, чтобы он выводил мне токены обратно (эти токены будут конвертированы в ASCII в другом сегменте кода, просто пытаясь заставить эту часть работать сначала).

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  char string[1024]; //Initialize a char array of 1024 (input limit)

  char *token;
  char *token_arr[1024]; //array to store tokens.
  char *out; //used
  int count = 0;

  while(fgets(string, 1023, stdin) != NULL) //Read lines from standard input until EOF is detected.
  {
    if (count == 0)
      token = strtok(string, " \n"); //If first loop, Get the first token of current input

    while (token != NULL) //read tokens into the array and increment the counter until all tokens are stored
    {
      token_arr[count] = token;
      count++;
      token = strtok(NULL, " \n");
    }
  }

  for (int i = 0; i < count; i++)
    printf("%s\n", token_arr[i]);
  return 0;
}

это кажется мне правильной логикой, но потом я все еще учусь.Кажется, проблема связана с потоковой передачей в несколько строк перед отправкой сигнала EOF с помощью ctrl-D.

Например, при вводе:

this line will be fine

Программа возвращает:

this line will be fine

Но если дано:

none of this

is going to work

Возвращает:

is going to work

ing to work

to work

любая помощь очень ценится.Я продолжу над этим работать.

1 Ответ

0 голосов
/ 14 сентября 2018

Здесь есть несколько проблем:

  1. Вы никогда не вызовете token = strtok(string, " \n"); снова после того, как строка будет "сброшена" до нового значения, поэтому strtok() все еще думает, что это токенизация вашей исходной строки.

  2. strtok возвращает указатели на «подстроки» внутри string. Вы изменяете содержимое того, что находится в string, и ваша вторая строка фактически портит вашу первую (поскольку исходное содержимое string перезаписывается).

Чтобы сделать то, что вы хотите, вам нужно либо прочитать каждую строку в другой буфер, либо продублировать строки, возвращаемые strtok (strdup() - это один из способов - просто не забудьте free() каждую копию ...)

...