2014-12-02 3 views
1

У меня есть этот код на Си ++ (который я объясню ниже):Преобразование символов в строках в верхний регистр не работает

#include <iostream> 
#include <string> 
#include <vector> 
#include <cctype> 

using namespace std; 
int main() 
{ 
    // part 1 
    cout << "Write many words separated by either newlines or spaces:"<< endl; 
    string word; 
    vector<string> v; 
    while(cin >> word){ 
     if(word == "quit"){ 
      break; 
     } 
     else{ 
     v.push_back(word); 
     } 
    } 
    //part 2 
    for(string x:v){ 
     for(char &j:x){ 
      j = toupper(j); 
     } 
    } 
    //part 3 
    for(string x:v){ 
     cout << x << endl; 
    } 

    return 0; 
} 

То, что я пытаюсь сделать, это получить последовательность строк и преобразование каждого символа в строке в верхний регистр и выводить строки назад. Я хочу использовать векторы для этого, поскольку я изучаю его. В части 1 я получаю строки со стандартного ввода и сохраняю их в вектор-строке. Я пишу «quit», чтобы вырваться из цикла и начать писать буквы в каждой строке. Проблема с частью 2, очевидно. То, что я пытаюсь сделать, это следующее: 1- Получить строку, когда мы зацикливаемся. 2 Как только у нас есть строка, получите символ в этой строке и преобразуйте ее в верхний регистр. Это для всех символов. 3-Сделайте это для всех строк.

Когда я скомпилирую его, я получаю все правильно, за исключением строк, заглавных. Я действительно путают D:

+1

'строку х: V' Youre изменение копий строк. Вы забыли ссылку. – Borgleader

ответ

4
for(string x:v){ 
    for(char &j:x){ 
     j = toupper(j); 
    } 
} 

Вы берете каждый символ из строки по ссылке, но вы берете строку по значению. Попробуйте

for (string& x : v){ 
    // […] 
} 

Обратите внимание, что с C++ 1Z мы сможем использовать сжатый диапазон на основе для петель, что делает жизнь намного проще:

for (x : v) { // Captures by reference automatically 
    // […] 
} 
+0

Большое спасибо Коломбо. Я думал только о том, что нужно использовать только символы. Книга не напомнила мне об этом для векторов. Поэтому для каждой последовательности мне нужно взять свои «под» «вещи» по ссылке. (Извините за неправильное именование) –