尝试重新学习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)时也会发生这种情况;
我看到了文档,我认为除了我的需要外,我也将其复制下来。我显然错过了一些东西。
请反馈?
答案 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
不同)。