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.
相关产品推荐
相关产品推荐

