strtok()
- плохо спроектированная функция для начала. Проверьте свою документацию, чтобы увидеть, если у вас есть лучше. Кстати, никогда не используйте strtok()
в какой-либо многопоточной среде, если в ваших документах не указано, что это безопасно, поскольку он сохраняет состояние между вызовами и изменяет строку, к которой он вызывается. Я предполагаю, что strtok_s()
является более безопасной версией, но она не будет действительно безопасной.
Чтобы преобразовать std::string
в char *
, вы можете сделать:
char * temp_line = new char[line.size() + 1]; // +1 char for '\0' terminator
strcpy(temp_line, line.c_str());
и используйте temp_line
. Ваша установка может иметь функцию strdup()
, которая дублирует вышеперечисленное.
Причина, по которой вам нужно два вызова strtok_s()
, заключается в том, что они делают разные вещи. Первый сообщает strtok_s()
над какой строкой он должен работать, а второй продолжается той же строкой. Это причина для аргумента NULL; strtok_s()
говорит, что нужно продолжать исходную строку.
Следовательно, вам нужен один вызов для получения первого токена, а затем - один для каждого последующего токена. Они могут быть объединены с чем-то вроде
char * temp_string_pointer = temp_line;
while ((token = strtok_s( con, "#", &next_token)) != NULL)
{
temp_string_pointer = NULL;
и так далее, так как это вызовет strtok_s()
один раз с указателем строки, а затем с NULL
. Не используйте temp_line для этого, так как вы хотите delete[] temp_line;
после обработки.
Вы можете подумать, что это много повозится, но это то, что обычно влечет за собой strtok()
и родственники.