创建不同的字符串向量,并使用迭代器将这些字符串更改为大写

Create varies string vectors, and using iterator to change those strings to uppercase

本文关键字:字符串 迭代器 向量 创建      更新时间:2023-10-16

我是C++新手。我正在尝试解决一个像这样的问题:

问:创建不同的字符串向量,并使用迭代器将这些字符串更改为大写。

下面是我想出的代码。但是,IDE 始终输出错误。因为我是C++新手,所以我没有足够的知识来解决问题。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
using namespace std;
void checkAndPrint(vector<string> &vec) {
    cout << "content: [";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        for (char c : it) {
            c = toupper(c);
            cout << c;
        }
    }
    cout << "]n" << endl;
}
int main() {
    vector<string> s1;
    vector<string> s2(10);
    vector<string> s3(10, "hello");
    vector<string> s4{10, "world"};
    vector<string> s5{"good", "morning"};
    vector<string> s6{10, "10"};
    checkAndPrint(s1);
    checkAndPrint(s2);
    checkAndPrint(s3);
    checkAndPrint(s4);
    checkAndPrint(s5);
    checkAndPrint(s6);
}

错误:

error: invalid range expression of type 'std::__1::__wrap_iter<std::__1::basic_string<char> *>'; did you mean to dereference it with '*'?
        for (char c : it) {
                      ^
                      *

你需要取消引用迭代器:

for (char c : *it)

或者使用第二个范围 for 循环:

for (auto &v : vec) {
    for (char c : v) { ...

另请注意,当前您没有将原始向量修改

for (char c : *it)

在原始 char S 的副本上运行。要解决此问题,请改为迭代引用,即

for (char &c : *it)

最后,请注意,您应该添加一个转换,如 在调用 toupper之前,我需要转换为无符号字符吗?你也忘了#include <cctype>它提供了toupper.

it是迭代器,而不是字符串本身。它本质上是一个指向字符串的指针,该字符串会更改每次迭代指向的字符串,因此必须先取消引用它,然后才能访问for循环中的每个字符:

for (char c : it) {

应该变成:

for (char c : *it) {

此外,如果您希望更新字符串本身以使其大写,则需要在第二个 for 循环中使用 char 引用,如下所示:

for (char& c : *it) {

现在的方式是,你正在更改一个新的变量c(本质上是一个副本(,它不会反映在原始字符串中。使用 char 引用将允许您更改原始字符串中的字符。