2012-07-24 115 views
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, " "); 
} 

我不知道爲什麼上面的代碼中遇到錯誤,什麼是錯我的代碼C++的strtok返回錯誤

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) 
+3

爲什麼要使用'std :: string':'char buffer [] =「CCY 1.2597 Down 0.0021(0.16%)14:32 SGT [44]」;' – hmjd 2012-07-24 11:08:45

+0

另請參見:http://stackoverflow.com /問題/ 53849 /怎麼辦-I-記號化 - 一個字符串,在-C – Johnsyweb 2012-07-24 11:15:25

回答

0

buffer不應該是char*,只是char

它將包含字符,而不是指向他們。

0

宣言關buffer是錯誤的。擺脫'*'。 應該

char buffer[result.length() + 1]; 
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)讓你的生活更輕鬆。

1

你定義

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

是錯誤的。

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

您必須使用動態內存分配初始化c字符串。

+0

有沒有理由使用堆而不是堆棧分配?我懷疑不同的分配會混淆OP並轉移到實際類型問題上。 – thiton 2012-07-24 11:08:48

+2

@thiton C++是否支持VLA?我認爲這是一個C99的事情。 – FatalError 2012-07-24 11:10:01

+0

@thiton:編譯器怎麼知道多少字節堆棧在編譯時被保留? – PermanentGuest 2012-07-24 11:11:23