strtok_r токены с разделителями - PullRequest
0 голосов
/ 20 сентября 2011

Я нашел похожие посты, но нет четких ответов на мои вопросы о strtok_r.

Я использую strtok_r для анализа командной строки, чтобы получить команды, которые мне нужно выполнить через execv сфлаги, однако, для целей тестирования я распечатаю.При попытке разделить несколько символов, исключая пробелы, он работает нормально.Но при проверке пробелов, используя код ниже:

void tokenize(char *str1)
{
  char *token;
  char *saveptr1;
  int j, i;


  const char *delim = " ";
  i = strlen(str1);

  for(j = 0; j < i; j++, str1 = NULL)
  {
    token = strtok_r(str1, delim, &saveptr1);
    if(token == NULL)
      break;

    printf("save: %s\n", token);
    printf("\n");
  }
}

Я получаю следующий вывод для тестовой строки (ls -al):

save: ls

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Как вы читаете строку?Может быть, вы читаете строку с чем-то вроде: cin >> string;или scanf ("% s", str);который читает только первый токен ("ls").

Вместо этого вы должны прочитать всю строку с помощью чего-то вроде cin.getline () или scanf ("% [^ \ n]", str).Проверьте это!

Почему strtok_r стоит вместо strtok?

0 голосов
/ 20 сентября 2011

Ваш цикл for устанавливает str1=NULL после каждого прохождения цикла

for(j = 0; j < i; j++, str1 = NULL)
{
    ...
}

поэтому в первый раз в цикле он работает так, как вы ожидаете, но после этого никакие токены больше не извлекаются, потому что str1 больше не указывает на строку.

...