C++ 从字符串C+中读取单词+;而忽略空白、数字和符号。
我正在尝试编写一个程序,读取一个文本文件,计算每个唯一单词的数量,然后对唯一单词列表进行排序,并列出每个单词出现的次数。然而,我似乎无法从一个字符串中读入一个单词而不弄乱并阅读字母、数字和符号。我读过其他主题,但我的逻辑在某些方面有严重缺陷,我看不到C++ 从字符串C+中读取单词+;而忽略空白、数字和符号。,c++,string,C++,String,我正在尝试编写一个程序,读取一个文本文件,计算每个唯一单词的数量,然后对唯一单词列表进行排序,并列出每个单词出现的次数。然而,我似乎无法从一个字符串中读入一个单词而不弄乱并阅读字母、数字和符号。我读过其他主题,但我的逻辑在某些方面有严重缺陷,我看不到 int main() { fstream fp; string line; fp.open("syllabus.txt", ios::in); getline(fp, line); string word = findWords(
int main()
{
fstream fp;
string line;
fp.open("syllabus.txt", ios::in);
getline(fp, line);
string word = findWords(line);
cout << word << endl;
}
string findWords(string &line)
{
int j = 0;
string word;
for(int i = 0; i < line.size(); i++)
{
while(isalpha((unsigned char)line[j]) != 0 && isdigit((unsigned char)line[j]) != 1)
j++;
word += line.substr(0, j) + " + ";
line = line.substr(j, (line.size() - j));
}
return word;
}
intmain()
{
fstream-fp;
弦线;
fp.open(“提纲.txt”,ios::in);
getline(fp,line);
字符串字=查找字(行);
库特
你只读了一行,但在问题部分,你说你想读整个文件
为什么定义findwords来获取字符串的地址而给出字符串
i
你的代码块有很多问题。其中一个问题是,你不想在迭代时更改行。一般来说,你不应该更改迭代的内容。你需要一个开始索引和结束索引(从搜索中找到)
这里有一个技巧,你可以用>>操作符阅读一个单词
ifstream fp( "syllabus.txt" );
string word;
vector<string> words;
while (fp>> word)
words.push_back(word);
ifstream fp(“提纲.txt”);
字符串字;
向量词;
while(fp>>word)
单词。推回(单词);
这个循环看起来很奇怪:
for(int i = 0; i < line.size(); i++)
{
while(isalpha((unsigned char)line[j]) != 0 && isdigit((unsigned char)line[j]) != 1)
j++;
word += line.substr(0, j) + " + ";
line = line.substr(j, (line.size() - j));
}
for(int i=0;i
您的“行”在循环中被修改,但发生这种情况时,您的“i”不会重置为新字符串的开头。“i”在循环中是不相关的,它不会出现在任何地方
那么为什么会出现这种循环呢
至于解决方案,有多种方法
- 如果要循环,最简单的方法是将行加载到字符串中,然后使用
string::find_first_not_of
,其中包含所有字母字符的字符串。这可能不是最有效的,甚至不是最优雅的。这将返回一个位置,对于字符串结尾或第一个非字母字符
- 下一个最简单的算法是一个常规的std::find算法,它使用迭代器并允许您输入自己的谓词,您可以将其基于非字母的形式。使用C++11很容易编写基于isalpha的lambda(旧的C版本或增强的C++版本,如果字符串包含字符集外的字符,则使用区域设置)。这将返回一个迭代器,即字符串的<代码>结尾(<)/代码>或第一个非字母字符的位置。
您的输入文本是什么?您的输出文本是什么?您希望它是什么?如果输入是“aaaa1234.01字母表季节2013”,那么输出将是“aaaa+字母表+季节”基本上,只有字母、所有空白、符号和数字被删除。这就是我所想的。1。如果我能得到一行功能,我会逐行读取文件。这只是分配的一些奇怪参数。C++实际上允许我通过检查字符串索引来读取,这在任何一个可能都不可能用的字符串中是有用的。你是对的,我试图用I作为substr()的起点,用j作为长度,但显然我不是。