2015-04-12 148 views
-2

试图重新学习C/C++ 为什么当我运行此:的char *字符串从while循环

char* tmp; 

while ((tmp = strtok(itr->c_str(),' ')) != NULL) { 
      std::string s(tmp); 
      cout << "S " << s<< endl; 
} 

我得到这样的:

/usr/include/c++/4.8.3/bits/basic_string.h:437:7: note: candidate expects 0 arguments, 1 provided 

它要么或我做没有足够的论据。我知道tmp不是NULL,因为我正在while循环中检查它。 当我尝试string s = string(tmp);

我看到了文档,并且我以为除了我的需要以外,我都会将其复制下来。我明显错过了一些东西。

请不要反馈?

+2

请发布* full *错误消息,最好使用[MCVE](http://stackoverflow.com/help/mcve),我们可以复制,粘贴和运行。 – chris

+1

您的错误可能不在此代码段中。 – 2015-04-12 23:48:21

+0

鉴于你已经接受了本的答案,我非常好奇剩下的错误是什么,因为它目前没有任何意义。 – chris

回答

2

不能对常量字符串使用strtok,因为它实际上与NUL终止符覆盖,所以这是不行的

strtok(itr->c_str(),' ') 

你的循环还没有执行正确的步骤来获得多个标记来自相同的字符串。

既然你要复制到一个单独的实例string每个令牌无论如何,考虑使用std::stringfind成员函数substr一起,避免strtok完全。 the canonical question about splitting a std::string给出了许多不同的示例我提出的确切方法见in one of the answers there

+0

按照你的建议使用substr,find。我不需要strtok。谢谢! –

1

我同意本,有更好的方法来做到这一点,但FWIW将展示如何fix your code。特别要注意使用&s[0](在你的情况下为&(*itr)[0])得到一个(可写入)char*的字符串,并且在第一次调用之后nullptr必须传递给后续的strtok调用。

#include <iostream> 
#include <cstring> 

int main() 
{ 
    std::string s = "first second third fourth fifth sixth"; 
    for (char* tmp = std::strtok(&s[0], " "); tmp; 
     tmp = std::strtok(nullptr, " ")) 
    { 
     std::string field(tmp); // can "<< tmp <<" below directly.... 
     std::cout << "S " << field << '\n'; 
    } 
} 

我相信C++ 11是第一个C++标准,强制连续缓冲区std::string,所以上面的代码不能保证与早期版本的工作,但实际上我听过的所有std::string实现使用的连续内存(与STL的rope不同)。

+0

是的,这需要照顾的这两个问题,我看到,再加上分离,应待字符串不是单字符错误。我建议为两个不同的'std :: string'变量使用不同的名称,以避免混淆。 –

+0

@ BenVoigt:哦 - 甚至没有注意到's'''''''干杯的双重用途。 –