【问题标题】:strtok doesn't tokenize the char* neither is this program printing any datastrtok 不会标记 char*,该程序也不会打印任何数据
【发布时间】:2014-11-14 09:33:07
【问题描述】:

这是程序:

#include <QPoint>
#include <string.h>
#include <QList>
using namespace std;
#include <iostream>

int main(int argc, char *argv[])
{
    int y = 14;
    char * str = new char [y];
    str = "23,211,23,211";

    char *pch;
    std::cout << "\nSplitting string into tokens: \n" << str;

    pch = strtok (str,",");
    QList <int> p;
    while (pch != NULL)
    {
        std::cout << "\npch:" << pch;
        p.push_back (atoi (pch));
        pch = strtok (NULL, ",");
    }


    std::cout << "Length of p " <<  p.length() << std::endl;

    QPoint first;
    first.setX               (p[0]);
    first.setY               (p[1]);

    QPoint second;
    second.setX              (p[2]);
    second.setY              (p[3]);

    return 0;
}

输出是:

我错过了什么?

【问题讨论】:

  • 你为什么在 C++ 中使用strtok
  • 我找不到任何简单的函数来基于 c++ 中的标记返回字符串部分。 @PiotrS。
  • char * str = new char [y]; str = "23,211,23,211" 这将是两短行的内存泄漏。随后对只读字符串文字的修改只会加剧混乱。
  • 你可以尝试使用QString::split来做。像这样:QStringList list = str.split(",");
  • @WhozCraig 谢谢,您能否详细说明一下应该如何纠正它?

标签: c++ qt pointers strtok


【解决方案1】:

您的代码中有几个错误。首先是内存泄漏。一开始你动态分配内存,它的地址被分配给指针str

char * str = new char [y];

然后你用字符串文字"23,211,23,211"的地址重新分配了指针

str = "23,211,23,211";

这样分配内存的地址就丢失了。

当函数strtok 尝试更改作为参数传递给它的字符串时,无论在 C++ 中还是在 C 中都不能修改字符串文字。所以程序有未定义的行为。

我认为你的意思如下。

char * str = new char [y];
strcpy( str, "23,211,23,211" );

在一般情况下p 的长度也可以为零。因此,如果不检查它是否具有非零长度,则不得将下标运算符与 p 一起使用。

您可以使用在标头&lt;sstream&gt; 中声明的字符串流std::istringstream,而不是C 函数&lt;sstream&gt;

考虑到您应该在 C++ 中使用标头 &lt;cstring&gt; 而不是 &lt;string.h&gt;

#include <cstring>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2015-07-24
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多