Не могу заставить toupper работать с вектором

Я работаю над упражнением, чтобы хранить слова в <vector> из strings, затем преобразовывать все буквы в верхний регистр и распечатывать восемь слов в строке. Все работает нормально, кроме части toupper() моего кода. Вот это все:

vector<string> words;
string theWords;
string word;

while(cin >> word)
    words.push_back(word);

for(auto &i : words) {
    word = i;
    for(auto &j: word)
        j = toupper(j);
}

int k = 0;
for(auto i : words) {
    cout << i << " ";
    ++k;
    if(k % 8 == 0)
        cout << endl;
}

person spartanhooah    schedule 19.08.2013    source источник
comment
Добро пожаловать в Stack Overflow. Чтобы получить наилучшие ответы на вопросы, вы всегда должны пытаться опубликовать sscce, что вы ожидаете от вывода/поведения. и то, что вы выводите / ведете себя вместо этого, вы видите. Если у вас возникла ошибка компиляции, пожалуйста, опубликуйте ошибку компилятора. stackoverflow.com/questions/how-to-ask   -  person kfsone    schedule 19.08.2013
comment
Я с таким раньше не сталкивался. В будущем так и сделаю, спасибо.   -  person spartanhooah    schedule 19.08.2013


Ответы (4)


Вы сохраняете новую обновленную строку в word, но вам следует обновить i

Изменить это

for(auto &i : words) {
    word = i;
    for(auto &j: word)    // word is updated, but your vector is not
        j = toupper(j);
}

... к этому:

for (auto &i : words)      // for every string i in words vector
    for (auto &j : i)      // update your i, not word
        j = toupper(j);
person Oleksiy    schedule 19.08.2013

Вы преобразуете временную строку «слово» в верхний регистр, а затем отбрасываете ее.

string word;

for(auto &i : words) {
    word = i; <<-- here
    for(auto &j: word)
        j = toupper(j);
}

Что вам нужно сделать, это

for(auto &i : words) {
    for(auto &j: i)
        j = toupper(j);
}

Живая демонстрация здесь: http://ideone.com/pwQBQr#.

person kfsone    schedule 19.08.2013

Немного опоздал на вечеринку, но вот версия без дополнительного цикла.

for(auto &i : words)
    std::transform(i.begin(), i.end(), i.begin(), ::toupper);
person andre    schedule 19.08.2013

выражение word = i использовало конструктор копирования строки. word не тот, что в векторе.

person lancerex    schedule 19.08.2013