如何检查 LPTSTR 字符串的内容
How to check the contents of a LPTSTR string?
我试图理解为什么在执行这段代码期间会发生分段错误(SIGSEGV(。测试while
指令中指定的条件时会发生此错误,但不会在第一次迭代时发生,而是在第二次迭代时发生。
LPTSTR arrayStr[STR_COUNT];
LPTSTR inputStr;
LPTSTR str;
// calls a function from external library
// in order to set the inputStr string
set_input_str(param1, (char*)&inputStr, param3);
str = inputStr;
while( *str != ' ' )
{
if( debug )
printf("String[%d]: %sn", i, (char*)str);
arrayStr[i] = str;
str = str + strlen((char*)str) + 1;
i++;
}
看完这个答案,我在网上做了一些研究,找到了这篇文章,所以我尝试修改上面的代码,使用本文中读到的这段代码(见下文(。但是,此更改并未解决问题。
for (LPTSTR pszz = pszzStart; *pszz; pszz += lstrlen(pszz) + 1) {
... do something with pszz ...
}
正如此答案中所假设的那样,代码似乎需要双 null 终止的字符串数组。因此,我想知道如何检查inputStr
字符串的内容,以检查它是否实际上只包含一个空终止符字符。
注意:从指令打印的字符串中的字符数是第一次迭代时lstrlen(str)
函数调用返回的值的两倍printf
。
好的,既然您已经包含了其余的代码,很明显它确实是为了解析一组连续的字符串。 问题是您混合了窄字符串和宽字符串类型。 修复它所需要做的就是更改变量定义(并删除强制转换(:
char *arrayStr[STR_COUNT];
char *inputStr;
char *str;
// calls a function from external library
// in order to set the inputStr string
set_input_str(param1, &inputStr, param3);
str = inputStr;
while( *str != ' ' )
{
if( debug )
printf("String[%d]: %sn", i, str);
arrayStr[i] = str;
str = str + strlen(str) + 1;
i++;
}
具体来说,问题发生在以下行:
while( *str != ' ' )
由于您没有投str
char *
因此比较正在寻找宽 NUL 而不是窄 NUL。
str = str + strlen(str) + 1;
你越界了,改成
str = str + 1;
或者简单地:
str++;
你不一致地使用 TSTR
和 strlen
,后者假设TCHAR = char
在任何情况下,strlen
都返回字符串的长度,即它包含的字符数,不包括 NUL 字符。
您的算术值为 1,但您知道在分配缓冲区时必须在字符串的长度上加 1。
但是,在这里您从位置 0 开始并添加长度,这意味着您处于位置 len
即字符串的长度。现在,字符串从偏移量0
运行到偏移量len - 1
偏移量len
保存空字符。偏移len + 1
超出范围。
有时你可能会侥幸阅读它,如果有额外的填充,但它是未定义的行为,在这里你得到了一个段错误。
在我看来,这看起来像是需要双空终止字符串数组的代码。我怀疑您正在传递一个以 null 结尾的字符串。
所以你正在使用这样的东西:
const char* inputStr = "blah";
但代码需要两个 null 终止符。如:
const char* inputStr = "blah ";
或者可能是包含多个字符串的输入值:
const char* inputStr = "foo bar ";
请注意,最后两个字符串确实以双 null 结尾。尽管在字符串末尾只显式写入一个 null 终止符,但编译器会隐式添加另一个终止符。
您的问题编辑在工作中抛出了一个新的扳手?演员表
strlen((char*)str)
非常可疑。如果你需要投射,那么投射一定是错误的。人们想知道LPTSTR
为您扩展了什么。据推测,自从您添加了该强制转换以使代码编译以来,它扩展到wchar_t*
。如果是这样,那么演员阵容就没有好处了。你对编译器撒谎(str
不是char*
(,对编译器撒谎永远不会有好结果。
分割错误的原因已经由 Alter 的答案给出。但是,我想补充一点,解析 C 样式字符串的通常风格更优雅且不那么冗长
while (char ch = *str++)
{
// other instructions
// ...
}
ch
的范围仅在循环主体中。
旁白:要么将问题标记为C
,要么C++
但不能两者兼而有之,它们是不同的语言。