разбор строки с помощью strtok_r

моя строка выглядит так:

abcd "efgh [data\]" pqrl 12fgd]

Я хочу проанализировать до ']', который не сопровождается обратной косой чертой '\'

Могу ли я сделать это с strtok_r? Если нет, то как мне это сделать?


person hari    schedule 09.08.2011    source источник
comment
Где все идиотские Что вы пробовали комментировать?   -  person SSH This    schedule 14.12.2012


Ответы (3)


Не существует единого способа сделать это с помощью strtok_r. Поскольку ваш разделитель представляет собой один символ, вы всегда можете восстановить нужную строку, вставив разделитель обратно, если последним символом токена, возвращаемого strtok_r, является '\'.

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

int main()
{
  char str[] = "abcd \"efgh [data\\]\" pqrl 12fgd]";
  char *tokens[2] = {0};
  char *pToken = str;
  unsigned int i = 0;

  for( tokens[i] = strtok_r( str, "]", &pToken ); ++i < 2; 
    tokens[i] = strtok_r( NULL, "]", &pToken ) ) {
  }

  for( i = 0; i < 2; ++i ) {
    printf( "token %d = %s\n", i, tokens[i] );
  }

  for( i = 0; i < 2; ++i ) {
    if( tokens[i][strlen(tokens[i]) - 1] == '\\' ) {
      tokens[i][strlen(tokens[i])] = ']';
    }
  }

  printf( "output = %s\n", str );

  return 0;
}

Это выводит:

token 0 = abcd "efgh [data\
token 1 = " pqrl 12fgd
output = abcd "efgh [data\]" pqrl 12fgd
person Praetorian    schedule 09.08.2011

Вы могли бы сделать это с strchr. Вот как я бы попытался это сделать (непроверенный):

p = str;
while ((p = strchr(p, ']')) {
    if (p > str && *(p-1) != '\')
        /* This is it. */
person cnicutar    schedule 09.08.2011

strtok ищет любой одиночный символ в наборе для поиска. Вы можете разделить на ], а затем проверить, какие из них имеют предшествующий \, но вы не можете искать с ним регулярное выражение.

person Martin Beckett    schedule 09.08.2011