использование strtok для анализа аргументов командной строки в c ++

Я пытаюсь разобрать аргументы командной строки с помощью strtok. Я получаю один успешный токен перед тем, как войти в цикл, но как только я вхожу в цикл while для токенизации остальных моих аргументов, он перестает работать. Есть идеи? код:

int main(int argc, char *argv[])
{
char *t = NULL;
t = strtok(*argv," ,.-");
while (t != NULL)
{
    cout << t << endl;
    t = strtok (NULL, " ,.-");
}
return 0;
}

person John Dodson    schedule 16.02.2014    source источник
comment
Какая строка, которую вы токенизируете, не работает? ABC DEF у меня отлично работает. Как это происходит, когда они разделены,. или -   -  person codah    schedule 17.02.2014
comment
imo, strtok никогда не следует использовать в C ++. Это одна из самых уродливых функций в C.   -  person Brian Bi    schedule 17.02.2014
comment
Я пишу программу-оболочку, поэтому тестирую с помощью ls -l   -  person John Dodson    schedule 17.02.2014
comment
На моей платформе первая строка - это путь к исполняемому файлу. Кроме того, - есть в вашем токене и в вашем списке разделителей. Но да, учить strtok на C ++ ... печально.   -  person codah    schedule 17.02.2014


Ответы (1)


Стрток работает не так. Последующие вызовы strtok продолжат обработку первого аргумента, предоставленного при первом вызове. strtok не должен использоваться для этого, поскольку аргументы уже были токенизированы, то есть они не находятся в одном массиве символов.

person user2672165    schedule 16.02.2014
comment
Понятно. Я воспользовался документацией cplusplus.com, так что, возможно, это была ошибка. У вас есть предложения по токенизации моего ввода? - person John Dodson; 17.02.2014
comment
Да, вы должны перебрать элементы массива argv и обработать их. Нет необходимости в токенизации. У вас есть размер массива в argc. - person user2672165; 17.02.2014
comment
Я бы хотел, но боюсь, что strtok () - это часть моего задания. Отстой, что, прочитав некоторое время, я понимаю, что strtok - это порождение сатаны - person John Dodson; 17.02.2014
comment
Да, особенно потому, что это не потокобезопасный. Вы можете использовать его для токенизации отдельного аргумента командной строки за раз при условии, что каждый аргумент должен быть токенизирован. strtok - это больше C, чем C ++, и не функция, на которой следует сосредоточиться в школе - person user2672165; 17.02.2014
comment
+1 Ответ правильный. Чтобы угодить своему учителю, вам нужно создать одну строку из командной строки и токенизировать ее. т.е. «де-токенизировать» его! - person codah; 17.02.2014