C++ 在C+中使用"u tcstok"时发生访问冲突错误+;

C++ 在C+中使用"u tcstok"时发生访问冲突错误+;,c++,winapi,C++,Winapi,我正在尝试运行以下代码 TCHAR* str1 = TEXT("C:\\Program Files\\Internet Explorer;"); const TCHAR* del = TEXT(";"); TCHAR* token = _tcstok(str1, del); 当我在VS 2010中运行此功能时,我得到以下异常: 字符串_Tchars.exe中0x10275af4(msvcr100d.dll)处未处理的异常:0xC0000005:访问冲突写入位置0

我正在尝试运行以下代码

TCHAR* str1 = TEXT("C:\\Program Files\\Internet Explorer;");     
const TCHAR* del = TEXT(";");        
TCHAR* token = _tcstok(str1, del);   
当我在VS 2010中运行此功能时,我得到以下异常:
字符串_Tchars.exe中0x10275af4(msvcr100d.dll)处未处理的异常:0xC0000005:访问冲突写入位置0x0041839c

我的目标是能够获取分号“;”之前的部分,然后对该标记进行附加,以获取最终字符串c:\Program Files\Internet Explorer\iexplore.exe


有人能解释一下导致此异常的原因吗?

\u tcstok
试图修改常量字符串(字符串文字),从而导致未定义的行为,该行为以访问冲突的形式出现

我在这里提到的字符串文字是:

TCHAR* str1 = TEXT("C:\\Program Files\\Internet Explorer;"); 
       ^^^^
程序不应该修改它,并且
\u tcstok
尝试这样做,因此未定义的行为

而是使用可修改的非常量字符串数组:

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

您只能对可修改的字符串使用
strtok()
(及其Windows相关项)。因此,将字符串设置为本地字符数组:

TCHAR str1[] = TEXT("C:\\Program Files\\Internet Explorer;");
TCHAR* token = _tcstok(str1, ";");
// etc.
tokenizer函数实际上是通过将分隔符替换为空字节来修改字符串的,因此您无法在只读字符串上使用它

如果字符串是通过指向const的指针找到的,请首先将其复制到本地数组(例如,复制到
std::vector
):

void foo(const TCHAR*str)
{
std::vector s(str,_tcslen(str)+1);//本地副本,包括空终止符
TCHAR*str1=s.data();//或&s[0]
TCHAR*令牌=_tcstok(str1,“;”);
// ...
}

感谢您的回复。我在没有“const”说明符的情况下进行了尝试,并出现了相同的崩溃。那么我该如何使用这个功能呢?@Prakash:更新了回答您的问题的答案。谢谢Als和Kerrek SB,这真的很有帮助,在遵循您的建议后,我没有遇到这个问题。
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, ";");
  // ...
}