2012-10-13 104 views
1

Possible Duplicate:
Using strtok with a std::string錯誤:從 '爲const char *' 的無效轉換到 '字符*'

#include<iostream> 
#include <string> 
#include <string.h> 

using namespace std; 

int main() 
{ 
    string s("hello hi here whola"); 
    string background; 
    char *strval; 

    char* tok = strtok_r(s.c_str()," ",&strval); 
    while(tok !=NULL) 
    { 
    cout << tok <<"\n"; 
    if (tok == "&") 
     background = tok; 
    else 
    { 
     statements1; 
     statement2.. ; 
    } 
    tok = strtok_r(NULL, " ",&strval); 
    } 

    return 0; 
} 

輸出:

new.cpp: In function ‘int main()’: 
new.cpp:13:47: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive] 
/usr/include/string.h:359:14: error: initializing argument 1 of ‘char* strtok_r(char*, const char*, char**)’ [-fpermissive] 
+4

你爲什麼要標記這個C?你的印象是C和C++是相同的語言嗎? –

+3

這真的很可怕。先選擇一種語言,我推薦C++。 – Andro

+2

爲什麼人們在使用不同的語言時將其標記爲c和C++? –

回答

7

s.c_str()返回一個指針爲const char,以防止你修改備份內存。您需要將此常量字符串的可寫副本說成strdup()函數,因爲strtok()確實會修改您正在掃描令牌的字符串。

+0

問題在於將C++字符串類和char *類型從C一起使用。 – Andro

+0

@Andrej我很好奇,如果在C++中禁止'char *'類型:) – Serge

+0

當然不是,但混合這些類型是給定的情況似乎沒有必要和有點危險。 – Andro

1

strtok修改其論點。這是不是與string.c_str()允許的,因爲它是一個常量字符*

而且,即使它的工作你if(tok == "&")將無法​​工作,因爲托克是一個char *,而不是一個字符串,你會因此做指針,而不是內容比較。

您將需要使用strcmp()

由於您使用的字符串,爲什麼不能去打破,並使用其他的C++結構?

stringstream ss(s); 
string tmp; 
while (ss >> buf) { 
    if(buf == "&") background = buf; // one wonders why 
    cout << buf << '\n'; 
} 
0

您的代碼混合C++ string S和cout s的與c strtok_r功能。這不是一個好的組合。

您的錯誤的直接原因是c_str()返回const char *strtok()要求非const char *。它想要修改您作爲參數傳遞的字符串,並且不允許修改c_str()返回的字符串。

如果要執行此C風格,請將s切換爲char[]

char s[] = "hello hi here whola"; 
int background = 0; 
char *strval; 

char* tok = strtok_r(s, " ", &strval); 
while (tok != NULL) 
{ 
    printf("%s\n", tok); 

    if (strcmp(tok, "&") == 0) 
     background = 1; 
    else 
    { 
     statement1; 
     statement2; 
     ... 
    } 

    tok = strtok_r(NULL, " ", &strval); 
} 
相關問題