токены strtok_r с разделителями

Я нашел похожие сообщения, но не нашел четких ответов на свои вопросы о 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

person flamewar    schedule 20.09.2011    source источник


Ответы (2)


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

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

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

person rendon    schedule 20.09.2011
comment
Я читаю из командной строки, используя scanf, но я не понимаю, что делает написанный вами scanf. Кроме того, strtok_r, так как я должен отслеживать другие команды, влияющие на создание и порядок процессов. - person flamewar; 20.09.2011
comment
если вы вводите: ls -al и используете scanf(%s, str), scanf читает только ls. scanf(%[^\n]\n, str) = читать всю строку, читать, не достигая конца строки (^\n), возможно, вы предпочитаете использовать gets(), который читает строку, а не только строку. - person rendon; 20.09.2011
comment
Теперь я получаю правильную полную строку, используя предложенный вами scanf, однако я зависаю до тех пор, пока не будет введена другая строка ввода, затем программа выполняется и печатается. Как вы думаете, было бы лучше вместо этого запустить цикл gets? - person flamewar; 20.09.2011
comment
Попробуйте использовать scanf(%[^\n], str): удалите последний '\n'. Есть спорный вопрос по поводу использования gets(), на самом деле не рекомендуется. - person rendon; 20.09.2011
comment
это была проблема, не нужен лишний символ \n, большое спасибо за помощь - person flamewar; 20.09.2011

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

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

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

person Lee    schedule 20.09.2011