You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++字符串排序代码报错:invalid types 'char[int]' for array subscript

问题:字符串排序时触发invalid types 'char[int]' for array subscript编译错误

编译时出现如下错误:

main.cpp|32|error: invalid types 'char[int]' for array subscript|

用户提供的C++代码:

void sortAndPrint(std::string param) {
char odd,even,sc,cc[param.length()];
int i = 0;
std::stack<char> letter,letters;
for(int i = 0; i > param.size(); i++){
        letter.push(param[i]);
}
while(!letter.empty()) {letters.push(letter.top()); letter.pop();}
while(!letters.empty()){

    if((char)letters.top()>='a' && (char)letters.top() <= 'z') sc[i] = letters.top();
    else if (letters.top()>='A' && letters.top() <= 'Z' ) cc[i] = letters.top();
    else if (int(letters.top()) % 2 = 0) even[i] = letters.top();
    else if (int(letters.top()) % 2 != 0) odd [i] = letters.top();
    letters.pop();
    i++;
}
std::cout <<"Odd: ";
for(int i = 0; i > sizeof(odd); i++){cout <<odd[i] << " ";}
std::cout <<"\nEven: ";
for(int i = 0; i > sizeof(even); i++){cout <<even[i]<<" ";}
std::cout <<"\nSmall letters: ";
for(int i = 0; i > sizeof(sc); i++){cout <<sc[i]<<" ";}
std::cout <<"\nCaptial letters: ";
for(int i = 0; i > sizeof(cc); i++){cout <<cc[i]<<" ";}
}

用户同时提到代码处理单/双引号有问题,且无法正确使用数组下标与字符比较。


问题分析与修复方案

核心错误点:

  • 变量类型不匹配:odd、even、sc被声明为单个char变量,却使用数组下标odd[i]访问,这是触发编译错误的直接原因。必须将它们改为数组或动态容器(如std::vector<char>)。
  • 循环条件错误:第一个for循环的条件是i > param.size(),这会导致循环根本不执行,无法将字符串元素入栈。应改为i < param.size()。
  • 赋值/比较混淆:int(letters.top()) % 2 = 0中使用了赋值运算符=,正确的比较应该用==。
  • 非标准变长数组:cc[param.length()]是C风格变长数组,C++标准不支持,建议替换为std::vector<char>。
  • 输出循环逻辑错误:输出时用i > sizeof(odd)作为循环条件,且sizeof(odd)对于单个char仅为1,完全无法正确遍历元素。需要记录每个容器的实际元素数量,而非依赖sizeof。
  • 字符判断不严谨:直接用字符ASCII范围判断大小写/数字,不如使用C++标准库的islower()、isupper()、isdigit()函数可靠,还能处理 locale 相关的字符。

修正后的代码示例:

#include <iostream>
#include <string>
#include <stack>
#include <vector>
#include <cctype> // 包含字符判断函数

void sortAndPrint(std::string param) {
    // 用vector存储不同类型的字符,动态扩容
    std::vector<char> odd_chars, even_chars, small_chars, capital_chars;
    std::stack<char> letter, letters;

    // 修正循环条件:将字符串元素入栈
    for (size_t i = 0; i < param.size(); ++i) {
        letter.push(param[i]);
    }

    // 反转栈(原逻辑是将第一个栈的元素弹出压入第二个栈,实现反转)
    while (!letter.empty()) {
        letters.push(letter.top());
        letter.pop();
    }

    // 分类存储字符
    while (!letters.empty()) {
        char c = letters.top();
        if (islower(c)) {
            small_chars.push_back(c);
        } else if (isupper(c)) {
            capital_chars.push_back(c);
        } else if (isdigit(c)) {
            int digit = c - '0'; // 将字符转为数字值
            if (digit % 2 == 0) {
                even_chars.push_back(c);
            } else {
                odd_chars.push_back(c);
            }
        }
        // 可添加对单/双引号的处理逻辑,比如单独存储
        letters.pop();
    }

    // 输出各类字符
    std::cout << "Odd: ";
    for (char c : odd_chars) {
        std::cout << c << " ";
    }
    std::cout << "\nEven: ";
    for (char c : even_chars) {
        std::cout << c << " ";
    }
    std::cout << "\nSmall letters: ";
    for (char c : small_chars) {
        std::cout << c << " ";
    }
    std::cout << "\nCapital letters: ";
    for (char c : capital_chars) {
        std::cout << c << " ";
    }
    std::cout << std::endl;
}

额外说明:

  • 修正后的代码使用std::vector替代固定数组,避免了变长数组的兼容性问题,同时自动管理元素数量。
  • 使用标准库字符判断函数,提升代码可靠性和可读性。
  • 修复了所有循环逻辑错误,确保元素能正确入栈、分类和输出。
  • 如果需要处理单/双引号,可以添加对应的判断分支,将其存入单独的vector中。

内容的提问来源于stack exchange,提问作者Someone.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:31:35