如何检查 LPTSTR 字符串的内容

How to check the contents of a LPTSTR string?

本文关键字:字符串 LPTSTR 何检查 检查      更新时间:2023-10-16

我试图理解为什么在执行这段代码期间会发生分段错误(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++;
当然,

你不一致地使用 TSTRstrlen ,后者假设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 = "foobar";

请注意,最后两个字符串确实以双 null 结尾。尽管在字符串末尾只显式写入一个 null 终止符,但编译器会隐式添加另一个终止符。


您的问题编辑在工作中抛出了一个新的扳手?演员表

strlen((char*)str)

非常可疑。如果你需要投射,那么投射一定是错误的。人们想知道LPTSTR为您扩展了什么。据推测,自从您添加了该强制转换以使代码编译以来,它扩展到wchar_t*。如果是这样,那么演员阵容就没有好处了。你对编译器撒谎(str不是char*(,对编译器撒谎永远不会有好结果。

分割错误的原因已经由 Alter 的答案给出。但是,我想补充一点,解析 C 样式字符串的通常风格更优雅且不那么冗长

while (char ch = *str++)
{
    // other instructions
    // ...
}

ch的范围仅在循环主体中。

旁白:要么将问题标记为C,要么C++但不能两者兼而有之,它们是不同的语言。