Расщепление строки пробелом в C - PullRequest
7 голосов
/ 27 ноября 2008

Я работаю с C, и через сокет я получу сообщение с одним пробелом в нем, мне нужно разбить строку на части в этом месте. Как бы я поступил так?

Ответы [ 3 ]

14 голосов
/ 27 ноября 2008

strtok_r ваш друг.

Не используйте простой strtok(), так как он НЕ ориентирован на многопотоковое исполнение.

Даже на платформах, где это потокобезопасно (поскольку состояние хранится в Thread-Local Storage), все еще существует проблема, заключающаяся в том, что использование внутреннего состояния означает, что вы не можете анализировать токены из нескольких строк одновременно.

например, если вы пишете функцию, которая использует strtok() для разделения строки A, ваша функция не может быть вызвана в цикле второй функции, которая использует strtok() для разделения строки B.

5 голосов
/ 27 ноября 2008

Если вы владеете строковым буфером и знаете, что его можно безопасно изменять, вы можете использовать strtok_r(), как предлагали люди. Или вы можете сделать это сами, например:

char buffer[2048];
char *sp;

/* read packet into buffer here, omitted */

/* now find that space. */
sp = strchr(buffer, ' ');
if(sp != NULL)
{
  /* 0-terminate the first part, by replacing the space with a '\0'. */
  *sp++ = '\0';
  /* at this point we have the first part in 'buffer', the second at 'sp'.
}

Это может быть быстрее и / или легче понять, в зависимости от контекста.

0 голосов
/ 27 ноября 2008

Обычно это делается с помощью библиотечного вызова strtok (). Однако имейте в виду, что эта функция будет изменять входную строку (она вставляет NUL-символы «\ 0» везде, где был найден выбранный разделитель), поэтому вы можете вызвать strtok () для копии строки, если вам нужно получить доступ ко всему этому позже.

РЕДАКТИРОВАТЬ: как упомянуто другим автором, «обычный» strtok () не является потокобезопасным, поэтому strtok_r () является более безопасной функцией для вызова. Я не уверен, имеет ли strtok_r () ту же проблему при изменении входного буфера на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...