我已从文件中取出所有txt并逐行放入字符串数组中。我试图拆分这个字符串,以便我可以在单独的数组中逐字保存。请告诉我shell如何将字符串数组转换为char。
例如
string line[15]; // line[0] has : was there before
// line[1] has : then after
char * pch;
char *c = line.c_str(); // string to char (i am getting error here. Any body know?)
pch = strtok (c," ");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ");
}
错误:C2228:左边的' .c_str'必须有class / struct / union
答案 0 :(得分:2)
string line[15];
是一个字符串数组。所以当你有line.c_str();
行时,指向字符串的指针而不是字符串本身。指针没有.c_str()
方法,这就是编译器抱怨的原因。 (指针不具备任何方法,因此编译器会告诉您表达式的左侧必须是类/结构/联合类型)。要修复此问题,您需要索引数组以获取字符串。您可以使用以下内容执行此操作:line[0].c_str();
此外,您无法写入c_str()
返回的任何内容,因为它返回一个const指针。因此,如果您要对其进行更改,则需要首先从c_str
复制结果,然后才能对其进行操作。
另外值得一提的是,有c ++方式进行标记化,你可能会在这里找到一些例子Split a string in C++?。我最后一次这样做,我已经使用了boost,所以我使用了boost::tokenizer库。
答案 1 :(得分:1)
在C ++中有更简单的方法可以实现这一点。 strtok
函数是一个C函数,不能直接与std::string
一起使用,因为无法获得std::string
中基础字符的可写指针访问权限。您可以使用iostream
在C ++中直接用文件中的空格分隔单个单词。
不幸的是,标准库缺少一种简单,灵活,高效的方法来在任意字符上拆分字符串。如果你想使用iostream
来完成除空格以外的其他东西的拆分,它会变得更复杂。如果您需要更灵活的东西(并且它也可能更有效),使用来自shuttle87的boost::split
或boost::tokenizer
建议是一个不错的选择。
以下是从标准输入中读取单词的代码示例,您可以使用几乎相同的代码和ifstream
来读取文件,或使用stringstream
来读取字符串:{{3} }
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
using namespace std;
int main() {
vector<string> words;
copy(istream_iterator<string>{cin}, istream_iterator<string>{}, back_inserter(words));
copy(begin(words), end(words), ostream_iterator<string>{cout, ", "});
cout << endl;
}