c++ - 坏指针 : expression can not be evaluated while parsing tokens

标签 c++ c string pointers tokenize

在解析 token 时,我的所有 token 指针都变坏了,当我检查调试器时,它说无法计算表达式。 错误:CX0030:错误:无法计算表达式 token 的值为 0x00000000

我在这里遗漏了一些东西,我尝试了很多但无法更正它。我知道它与 const 等指针声明有关,但进行更改无济于事。

Windows + visual studio 2010 和被解析的文件是unicode UTF16

代码片段------

    const wchar_t* const DELIMITER = L"\"";
wchar_t buf[MAX_CHARS_PER_LINE];
fin.getline(buf, MAX_CHARS_PER_LINE);
wchar_t* token[MAX_TOKENS_PER_LINE] = {};
token[0] = wcstok(buf, DELIMITER);
if (token[0]) // zero if line is blank
    {
    int n = 0; 
         for (n = 0; n < MAX_TOKENS_PER_LINE; n++)   
        {
            token[n] = wcstok(0, DELIMITER); // subsequent tokens   --> error ,pointer becomes bad

            if (!token[n]) break; // no more tokens  -------------> code does not go beyond this

buf 有整个文件(这是另一个问题,当我尝试读取行时它会获取整个文件),有人可以帮我指出我在这里犯了什么错误吗?

最佳答案

如果没有发现定界符,您认为 token[0] = wcstok(buf, DELIMITER); 将为 NULL 的假设是不正确的。会有一个 token ;字符串的内容,并且很容易证明如下:

#include <iostream>
#include <cwchar>

int main()
{
    wchar_t data[] = L"NoDelimiter";
    wchar_t *ctx = nullptr, *token = wcstok(data, L"\"", &ctx);

    if (token != nullptr)
        std::wcout << token << std::endl;

    return 0;
}

输出

NoDelimiter

因此,这段代码:

token[0] = wcstok(buf, DELIMITER);
if (token[0]) // zero if line is blank

... 只有当它确实是一个真正的空白输入时才是正确的(即没有字符的空)。如果甚至有 一个 字符(例如讨厌的换行符),则 eval 将为真,您将陷入 for 循环。但是您可以通过这样做轻松地测试它是否是一个真正的空白行:

if (buff[0]) // true if line is not blank

继续前进,因为您故意跳过第一个将我们带到的标记:

for (n = 0; n < MAX_TOKENS_PER_LINE; n++)   
{
    token[n] = wcstok(0, DELIMITER); // will save NULL if original line had no delimiters
    if (!token[n]) 
        break;  // will break here since token[n] is NULL

总而言之,您的逻辑循环存在缺陷。在您开始跳过标记之前,您最好确保您确实阅读 一个由您认为存在的内容分隔的标记。如果不出意外,我建议您先测试以确保字符串具有 '"',然后再假设返回数据为非空的原因是因为存在一个数据。正如我上面所展示的,那不是wcstok() 将返回 token 的唯一方法。


替代方法

有许多选项可用于执行我认为您正在尝试执行的操作。这只是其中之一,您可以根据需要进行调整。

#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>

int main()
{
    wchar_t data[] = L"\"Test1\", \"Test2\", \"Test3\"";
    std::wistringstream iss(data);

    std::vector<std::wstring> tokens;
    std::wstring token;
    if (std::getline(iss, token, L'"') && std::getline(iss, token, L'"'))
    {
        while (iss)
        {
            // output the real token
            tokens.push_back(token);
            std::wcout << token << std::endl;
            std::getline(iss, token, L'"'); // skip separator to next "
            std::getline(iss, token, L'"'); // read through next "
        }
    }

    // tokens now has your "data" delimited tokens

    return 0;
}

关于c++ - 坏指针 : expression can not be evaluated while parsing tokens,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20396463/

相关文章:

c - PySide/pyQt 通过单击垂直标题在 QTableWidget 中选择整行时发送什么信号

java - 将排序后的数字字符串添加到 Java 中的 SortedSet 的问题

java - 如何在java中检查字符串是否为null?

c++ - Java 上的 HMAC SHA256 签名,C++ 私钥-公钥上的验证

c++ - OpenGL 更新顶点数组/缓冲区

c++ - 在泛型编程中选择类型参数

c - 不超过特定字符的字符串长度

c++ - Release模式仍然依赖于 MSVCP110D.dll (C++ MSVS)

c - 仅给出成员位置时结构的位置

c - 字符串检查 c pangramm 中带有制表符的字母