单词大写中的字符串下标超出范围错误

string subscript out of range error in word capitalization

实际上,该程序在 Devc++ 中运行良好,但如果我在 VisualStudio 中 运行 它会给我错误,有人知道为什么会这样吗?

程序应该检查它是否必须从 stati 数组中计算出一个字符串,每个单词的每个首字母都大写,然后它必须转换字符串变回小写,statoScelto[] 只是检查字符串是否需要打印。

#include <iostream>
#include <string>
#include <algorithm>

int main() {

    std::string stati[4] = { "italia", "francia", "spagna", "bosnia erzegovina" };
    bool statoScelto[4] = { true, false, false, true };
    int i, k;
    
    // here there is other code that eventually changes statoScelto[] values.
    
    for (i = 0; i < 4; i++) {
        if (statoScelto[i] == true) {
            stati[i][0] = toupper(stati[i][0]);

            for (k = 0; k < 16; k++) {
                if (stati[i][k] == ' ') {                          
                    stati[i][k + 1] = toupper(stati[i][k + 1]);
                }
            }

            std::cout << "\n" << stati[i];

            for (k = 0; k < 16; k++) {
                if (stati[i][k] == ' ') {                            
                    stati[i][k + 1] = tolower(stati[i][k + 1]);
                }
            }

            stati[i][0] = tolower(stati[i][0]);
        }
    }
    
    system("pause>0");
}

现在,程序应该打印:

意大利

波斯尼亚厄塞哥维那

但是当运行时会弹出字符串下标超出范围的错误。 有人知道它有什么问题吗?

您的代码有几个问题:

  1. 您需要在您定义的字符串字符周围放置双引号。 例如: std::string 颜色[4] = { "蓝色", "红色", "橙色", "黄色" };

  2. 大小 16 对最后一个单词有意义,其中大小为 16,但对于所有其他单词,您仍在尝试访问不存在的位置。 也许可以为每个单词的大小设置一个变量来解决这个问题。

你也可以把 if (stati[i][k] == ' ') 条件放在循环之前,所以它只在这种情况下进入