在c++中使用_tcstock时出现AccessViolation错误

AccessViolation error while using _tcstok in C++

本文关键字:AccessViolation 错误 tcstock c++      更新时间:2023-10-16

我试图运行以下代码

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

当我在VS 2010中运行这个时,我得到以下异常:
在String_Tchars.exe中0x10275af4 (msvcr100d.dll)的未处理异常:0xC0000005:访问违反写入位置0x0041839c.

我的目标是能够获得分号";"之前的部分,然后对该令牌进行追加,以获得最终字符串c:Program FilesInternet Explorer iexplorer .exe

有人能解释一下是什么导致了这个异常吗?

您只能使用strtok()(及其Windows亲戚)和可修改的字符串。所以让你的字符串成为本地字符数组:

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

tokenizer函数实际上通过将分隔符替换为空字节来修改字符串,因此无法在只读字符串上使用该函数。

如果您的字符串通过指向const的指针传递给您,请先将其复制到本地数组(例如复制到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, ";");
  // ...
}

_tcstok试图修改常量字符串(string Literal),导致未定义行为,这以访问冲突的形式呈现。

我这里指的字符串Literal是:

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

程序不应该修改它,_tcstok试图这样做,因此未定义行为

使用可修改的非const字符串数组:

TCHAR str1[] = TEXT("C:\Program Files\Internet Explorer;");