我正在尝试使用地图和字符串数组从句子创建单词词典。我的问题是每次我循环从数组中向地图添加值时,最后一项总是被复制为一个键。顺便说一下,这一切都在xCode上。
int main(){
char input[50];
int i = 0,
arr_size = 0;
string s[20];
cout << "Please input a phrase: ";
cin.getline(input, 50);
while(i < sizeof(input) - 1)
{
input[i] = tolower(input[i]);
if(isspace(input[i]) || ispunct(input[i]) )
arr_size++;
else
s[arr_size].operator+=(input[i]);
i++;
}
map<string, int> dictionary;
for (i = 0; i < arr_size; i++) {
if(dictionary.map::find(s[i]) == dictionary.end())
dictionary.insert(make_pair(s[i], 1));
else
dictionary.at(s[i])++;
}
typedef map<string, int>::const_iterator MapIt;
for (MapIt iter = dictionary.begin(); iter != dictionary.end(); iter++)
{
cout << iter->first << " : " << iter->second << endl ;
}
}
我的输出看起来像这样:
Please input a phrase: thE Blue Black BluE Cat Cat BLacK hat zap zap
black : 2
blue : 2
cat : 2
hat : 1
the : 1
zap : 1
zap : 1
答案 0 :(得分:0)
两个“zap”的不一样。可能最后一个包含换行符'\ n'。更一般地说,您需要学习如何正确地索引循环。
答案 1 :(得分:0)
因此,当我循环播放
时while(i < sizeof(input) - 1)
{
input[i] = tolower(input[i]);
if(isspace(input[i]) || ispunct(input[i]) )
arr_size++;
else
s[arr_size].operator+=(input[i]);
i++;
}
我没有检查除标点符号和空格之外的任何其他字符,所以它正在阅读其他所有字符。
for(int i = 0; i < sizeof(input) - 1; i++)
{
if(isspace(input[i]) || ispunct(input[i]))
arr_size++;
else if (isalpha(input[i])){
input[i] = tolower(input[i]);
s[arr_size].operator+=(input[i]);
}
}
此代码效果更好,索引更好。