2013-05-11 18 views
2
#include <iostream> 
#include <string.h> 
using namespace std; 

int main() { 
char *tok; 
string s = "Ana and Maria are dancing."; 
tok = strtok(s.c_str(), " "); 
while(tok != NULL) { 
    cout << tok << " "; 
    tok = strtok(NULL, " "); 
} 
return 0; 
} 

而且我得到这个错误:错误尝试使用“的strtok”的字符串

:9:29: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive] 
In file included from ceva.cc:2:0: 
348:14: error: initializing argument 1 of ‘char* strtok(char*, const char*)’ [-fpermissive]" 
+1

你应该考虑改变剧情,我的意思是安娜和玛丽亚正在做什么,或者这个问题会被标记为冒犯性的。 – biggdman 2013-05-11 09:10:52

回答

4

strtok()在其解析破坏性(即它写入给你,而你解析它解析字符串),所以它需要一个char*作为参数,而不是一个const char*

c_str()返回一个const char*,因为它不指望您写入它返回的缓冲区的内容。

解析的一种方法是strdup()(即复制)你想要工作的缓冲区并解析它,即;

char* buf = strdup(s.c_str()); 
tok = strtok(buf, " "); 
... 

请记住,一旦你完成了它,即可释放副本。

2

的问题是,c_str()返回const char*,因为string对象应该是主人缓冲区的封装字符串的存储位置,所以您无权修改它,除非通过string的成员函数。

在另一方面,strtok()接受一个指向(非constchar,即char*,这是编译器抱怨什么:你想传递的东西不可修改到想要修改的功能那个东西。

如果我可以提出一个更好的办法,这是在C++ 11更地道,因为你正在使用std::string无论如何,而做到以下几点:

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s = "Ana and Maria are dancing"; 

    std::string::size_type start = 0; 
    std::string::size_type pos = s.find(" "); 
    while (pos != std::string::npos) 
    { 
     std::string tok = s.substr(start, pos - start); 
     std::cout << tok << " "; 

     start = pos + 1; 
     pos = s.find(" ", start); 
    } 
} 

上面的代码也移除了这个指令:

using namespace std; 

它通常被认为是不好的编程习惯(特别是当放在全局命名空间范围内时),因为它很容易导致名称与属于std命名空间的实体发生冲突。

+0

感谢您的选择;我通过加入 char * d = strdup(s.c_str())来解决它。 tok = strtok(d,“”); – 2013-05-11 09:25:24

+0

@MardaloescuSerban:好的,很高兴你管理 – 2013-05-11 09:26:16