char *来自while循环的字符串

时间:2015-04-12 23:43:53

标签: c++ string

尝试重新学习C / C ++ 为什么我跑这个:

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 个答案:

答案 0 :(得分:2)

你不能在常量字符串上使用strtok因为它实际上用NUL终结符覆盖了分隔符,所以这不会起作用

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

你的循环也没有执行正确的步骤来从同一个字符串中获取多个标记。

由于您希望将每个令牌复制到单独的string实例中,请考虑使用std::string find成员函数以及substr,并避免{完全{1}} the canonical question about splitting a std::string给出了许多不同的例子我建议的确切方法是in one of the answers there

答案 1 :(得分:1)

我同意Ben有更好的方法来做到这一点,但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是第一个为std::string强制要求连续缓冲区的C ++标准,因此上述代码不能保证与早期版本一起使用,尽管实际上所有std::string实现都是#39;曾经听说过使用过的连续记忆(与STL&#39; s rope不同)。