2

我正在做一个练习,将单词存储在 a <vector>of 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;
}
4

4 回答 4

2

您将新更新的字符串存储在 中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);
于 2013-08-19T01:10:35.190 回答
2

您正在将临时字符串“word”转换为大写,然后将其丢弃。

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#

于 2013-08-19T01:11:23.287 回答
2

派对有点晚了,但这是一个没有额外循环的版本。

for(auto &i : words)
    std::transform(i.begin(), i.end(), i.begin(), ::toupper);
于 2013-08-19T02:42:42.803 回答
0

该表达式word = i使用了字符串复制构造函数。word不是向量中的那个。

于 2013-08-19T01:57:08.140 回答