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, ";");
// ...
}