我有一个函数可以将一个字符串分成多个部分,然后对其进行解析,但是当将一个字符串转换为 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::string
与 strtok
一起使用的想法从一开始就注定要失败。 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/