0
string result="CCY 1.2597 Down 0.0021(0.16%) 14:32 SGT [44]";
char* token;
char* buffer[result.length() + 1];  //Space for '\0'

strcpy(buffer, result.c_str());
buffer[result.length()] = '\0';     //insert '\0'
token = strtok(buffer, " ");
while (token != NULL) {
  /* work with token */
  token = strtok(NULL, " ");
}

我不确定为什么上面的代码出错了,我的代码有什么问题

main.cpp:51:30: error: cannot convert ‘char**’ to ‘char*’ for argument ‘1’ to ‘char* strcpy(char*, const char*)’
main.cpp:53:27: error: cannot convert ‘char**’ to ‘char*’ for argument ‘1’ to ‘char* strtok(char*, const char*)’
make: *** [main.o] Error 1

BUILD FAILED (exit value 2, total time: 893ms)
4

4 回答 4

4

您的代码有两个问题:首先,变量类型buffer错误,这是编译器发现的错误。其次,您(可能在不知不觉中)通过使用 gcc 的非标准可变长度数组 (VLA) 扩展偏离了 C++ 标准。从 C99 开始,此功能在 C 中是标准的,但在 C++ 中不是。

对于变量声明,以下行是错误的:

char* buffer[result.length() + 1];

这一行分配了一个指向堆栈上字符的指针数组。但是,strcpy需要一个指向字符向量的指针。当一个数组类型(如char[])衰减为一个指针(char*)时,一个指向字符( )的指针数组char*[]衰减为char**,这是一个太多的指针。改为声明:

char buffer[result.length() + 1];

现在,这仍然只能在 gcc 上编译。为了使您的代码兼容,您必须使内存分配动态化,例如通过使用:

char *buffer = new char[result.length() + 1];

然后执行

delete[] buffer;

在你的日常生活结束时。您应该使用智能指针 ( std::unique_ptr) 让您的生活更轻松。

于 2012-07-24T11:07:34.917 回答
1

你的定义

char* buffer[result.length() + 1]; 

是错的。

char* buffer = new char[result.length() + 1];

您必须使用动态内存分配初始化 c 字符串。

于 2012-07-24T11:07:54.123 回答
0

声明关闭buffer是错误的。摆脱'*'。它应该是

char buffer[result.length() + 1]; 
于 2012-07-24T11:05:29.177 回答
0

buffer不应该,而char*只是char

它将包含字符,而不是指向它们。

于 2012-07-24T11:04:55.383 回答