嘿伙计们因为string.at(x)而超出范围错误,我不明白为什么。任何帮助,基本上我试图确保第一个字符是否< 'A'或>我的对象字符串中的'z'。此外,我认为我的字符串比较可能无法正常工作,但如果我找到具有重复项的唯一单词,则可能与未完成的代码有更多关系。
struct wordCount{
string word;
int count;
}storeword[100];
void countWordFreq(wordCount compares[]){
int a=0;
unsigned i=0;
for(a;a<101;a++){
cout<<"Length"<<compares[a].word.length();
if(compares[a].word.at(i)<='z'||compares[a].word.at(i)>='A'){
compares[a].count++;
}
for(int b=1;b<101;b++){
cout<<"Length"<<compares[b].word.length();
if(compares[b].word.at(i)<='z'||compares[b].word.at(i)>='A'){
if(compares[a].word.compare(compares[b].word)==0){
cout<<"true" << endl;
compares[a].count++;
}
}
b++;
}
a++;
}
for(int q;/*compare[q].word.at(0)<='z'||compare[q].word.at(0)>='A'*/q<10;q++){
cout<<"Word: " << compares[q].word << " Count: " << compares[q].count << endl;
}
}
答案 0 :(得分:0)
哇。听起来有风险(是 - 如果是这样,对不起)不礼貌,我想我的工作方式会有所不同。
C ++标准库提供了相当多的工具来更轻松地完成这项工作,并且很难找到难以找到的错误等等。我会把它们用掉。
只是为了它的价值:我不确定我完全理解你为每个单词的第一个字符所描述的比较。目前我假设你只想计算以字母开头的东西。但是,如果需要的话,很容易改变它。
#include <string>
#include <map>
#include <iostream>
#include <iomanip>
#include <cctype>
#include <sstream>
void countWordFreq(std::string const &input) {
std::map<std::string, size_t> counts;
std::istringstream buffer(input);
std::string word;
// read the words, count frequencies of those that start with letters
while (buffer >> word)
if (isalpha(word[0]))
++counts[word];
// write out each word we found and how often it occurred:
for (auto const &count : counts)
std::cout << std::setw(20) << count.first << ": " << count.second << "\n";
}
目前,这将按字母顺序打印出唯一的单词。如果您不需要这种排序,则可以(通常)使用std::unordered_map
而不是std::map
来提高速度。