c++ - 在 C++ 中将字符串转换为 char* 时输出格式错误

标签 c++ visual-studio-2012 type-conversion

我有一个函数可以将一个字符串分成多个部分,然后对其进行解析,但是当将一个字符串转换为 char* 时,我得到了一个格式错误的输出。

int parseJob(char * buffer)
{ // Parse raw data, should return individual jobs
    const char* p;
    int rows = 0;
    for (p = strtok( buffer, "~" );  p;  p = strtok( NULL, "~" )) { 
        string jobR(p);
        char* job = &jobR[0];
        parseJobParameters(job); // At this point, the data is still in good condition
    }
    return (1);
}

int parseJobParameters(char * buffer)
{ // Parse raw data, should return individual job parameters
    const char* p;
    int rows = 0;
    for (p = strtok( buffer, "|" );  p;  p = strtok( NULL, "|" )) { cout<<p; } // At this point, the data is malformed.
    return (1);
}

我不知道第一个函数调用第二个函数之间发生了什么,但它使数据格式错误。

从给出的代码示例中可以看出,使用了将字符串转换为 char* 的相同方法,并且效果很好。

我正在使用 Visual Studio 2012/C++,非常感谢任何指导和代码示例。

最佳答案

您的代码无法运行的“物理”原因与 std::string 或 C++ 无关。它也不会在纯 C 中工作。 strtok 是一个将其中间解析状态存储在某个全局变量中的函数。这立即意味着您不能使用 strtok 一次解析多个字符串。在完成第一个解析 session 之前启动第二个解析 session 将覆盖第一个解析 session 存储的内部数据,从而破坏它无法修复。换句话说,strtok 解析 session 不得重叠。在您的代码中,它们确实重叠。


此外,在 C++03 中,直接将 std::stringstrtok 一起使用的想法从一开始就注定要失败。 std::string 中存储的内部序列不保证以 null 终止。这意味着通常 &jobR[0] 不是 C 字符串。它不能与 strtok 一起使用。要将 std::string 转换为 C 字符串,您必须使用 c_str()。但是 c_str() 返回的 C 字符串是不可修改的。

在 C++11 中,空终止符应该通过 [] 运算符可见,但似乎仍然没有要求将终止符对象与实际字符串连续存储,所以&jobR[0] 即使在 C++11 中也仍然不是 C 字符串。 c_str()data() 返回的 C 字符串是不可修改的。

关于c++ - 在 C++ 中将字符串转换为 char* 时输出格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033644/

相关文章:

c++ - Awesomium 1.7RC2 与 VS11

java - 如何在Java中不使用循环将String数组转换为int数组

当仅存在小数部分时,Oracle TO_NUMBER 转换失败

c++ - 具有指针参数的函数中的绑定(bind)错误

c++ - 对 QMediaPlayer 的 undefined reference

c++ - 如何解释 'regex e' 行?

.net - 具有存储过程的数据集与 Entity Framework

c++ - 如何返回指向多维数组的指针?

c# - Visual Studio Publish 提供了不同的二进制文件来构建

c++ - 在 C++ 中,我们可以使用 { } 进行 C 风格转换吗?