2015-06-01 6 views
3

Я читал много негативных вещей о strtok(), некоторые говорят, что она устарела, некоторые говорят, что это не поточно и т.д.ли strtok() безопасно использовать

Так что это правда, я могу использовать strtok() ? и это потокобезопасно?

Примечание: Я использую Visual C++.

+3

См. Http://stackoverflow.com/questions/4031075/strtok-function-thread-safety – Vagish

+0

Некоторые связанные вопросы с ответами отображаются справа (см. «Связанные»), например [this] (http : //stackoverflow.com/q/20820937/509868) – anatolyg

+1

В общем, вы должны избегать использования стандартной библиотеки C при написании кода на C++ - вместо этого используйте соответствующие типы данных и идиомы C++. –

ответ

8

Вы можете использовать его, это часть стандартной библиотеки.

Он использует внутреннее хранилище, которое является общим для всех пользователей функции, поэтому no не является потокобезопасным.

Это также изменяет шнур, который вы ему передаете, что довольно страшно.

Я бы не рекомендовал использовать его, в большинстве случаев.

1

Как говорится, вы можете использовать его, strtok безопасен в Visual C++, но не в другом месте. Одна проблема, которая существует с strtok, заключается в том, что статический буфер используется функцией strtok() во время разбора, поэтому он не является потокобезопасным. strtok_s является альтернативой этому. От here:

6.7.3.1 В strtok_s функция Функция strtok_s исправляет две проблемы в функции strtok:

  1. новый параметр, s1max, предотвращает strtok_s от хранения за пределами строки будучи лексемы , (Строка разделена на лексемы является одновременно входа и выход функции, так как strtok_s магазины нулевых символов в строке.)
  2. новый параметра, PTR, устраняет статическое внутреннее состояние, что предотвращает strtok от того, повторный участник (Подпункт 1.1.12). (ISO/IEC 9899 функция wcstok и функция ISO/IEC 9945 (POSIX) strtok_r исправить эту проблему одинаково.)
5

strtok() "безопасно" в том, что можно использовать и нет ошибок. Однако, если вы программируете C++, а не C, вы должны использовать строковые средства C++ для беспорядка со строками, а не полагаться на устаревшие функции C. Такие вещи, как std::string и std::stringstream, дадут вам большую гибкость, чем strtok, хотя логические ошибки будут менее вероятными.

Смежные вопросы