Ошибка AccessViolation при использовании _tcstok в C ++ - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь запустить следующий код

TCHAR* str1 = TEXT("C:\\Program Files\\Internet Explorer;");     
const TCHAR* del = TEXT(";");        
TCHAR* token = _tcstok(str1, del);   

Когда я запускаю это в VS 2010, я получаю следующее исключение:
Необработанное исключение в 0x10275af4 (msvcr100d.dll) в String_Tchars.exe: 0xC0000005: Место записи нарушения прав доступа 0x0041839c.

Мой объект, чтобы можно было получить часть перед точкой с запятой ";" и затем добавьте этот токен, чтобы получить окончательную строку c: \ Program Files \ Internet Explorer \ iexplore.exe

Может ли кто-то пролить свет на то, что вызывает это исключение?

Ответы [ 2 ]

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

Вы можете использовать strtok() (и его родственников в Windows) только с изменяемыми строками. Поэтому сделайте ваши строки локальными массивами символов:

TCHAR str1[] = TEXT("C:\\Program Files\\Internet Explorer;");
TCHAR* token = _tcstok(str1, ";");
// etc.

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

Если ваша строка приходит к вам через указатель на константу, сначала скопируйте ее в локальный массив (например, в std::vector<TCHAR>):

void foo(const TCHAR * str)
{
  std::vector<TCHAR> s(str, _tcslen(str) + 1);  // local copy, includes null terminator
  TCHAR * str1 = s.data();  // or &s[0]
  TCHAR* token = _tcstok(str1, ";");
  // ...
}
1 голос
/ 14 сентября 2011

_tcstok пытается изменить постоянную строку (строковый литерал), вызывая неопределенное поведение , которое представляет собой нарушение прав доступа.

Строка Literal Я имею в виду здесь:

TCHAR* str1 = TEXT("C:\\Program Files\\Internet Explorer;"); 
       ^^^^

Программа не должна его изменять, и _tcstok пытается сделать это, поэтому Неопределенное поведение .

Вместо этого используйте изменяемый массив неконстантных строк:

TCHAR str1[] = TEXT("C:\\Program Files\\Internet Explorer;");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...