2012-10-13 84 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); 
} 
相关问题