C ++ - 数组中的最后一个值在map中重复

时间:2018-03-13 03:49:43

标签: c++ xcode stl maps

我正在尝试使用地图和字符串数组从句子创建单词词典。我的问题是每次我循环从数组中向地图添加值时,最后一项总是被复制为一个键。顺便说一下,这一切都在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

2 个答案:

答案 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]);
        }
    }

此代码效果更好,索引更好。