C++字符串数组打印时出现Segmentation Error问题求助
解决C++逆序打印城市时的段错误问题
嘿,作为C++新手碰到这种段错误真的太常见了!咱们先揪出问题根源——你说选逆序('o'/'r')时崩溃,大概率是数组下标越界或者字符串处理的问题,这也是新手最容易踩的坑之一。
最可能的错误原因:逆序遍历越界
假设你的逆序打印函数是这么写的(很多新手会犯这个错):
void printReverse(char* cities[], int size) { for (int i = size; i > 0; i--) { cout << cities[i] << endl; // 这里访问了cities[5],数组根本没有这个元素! } }
C++数组是0索引的,5个城市的数组下标是0~4。如果循环从size(也就是5)开始,你就访问了数组之外的内存,直接触发段错误。
修正方案:用std::string简化字符串处理+正确遍历
新手阶段强烈建议用std::string代替C风格的char*数组,它会自动管理内存,避免很多手动分配内存的坑。下面是完整的可运行代码:
#include <iostream> #include <string> using namespace std; // 函数声明 void inputCities(string cities[], int total); void printInOrder(string cities[], int total); void printReverse(string cities[], int total); int main() { const int CITY_COUNT = 5; string cities[CITY_COUNT]; char userChoice; // 输入城市 inputCities(cities, CITY_COUNT); // 获取用户选择 cout << "\n请选择打印方式:输入's'正序,'r'逆序:"; cin >> userChoice; // 执行对应操作 if (userChoice == 's') { printInOrder(cities, CITY_COUNT); } else if (userChoice == 'r') { printReverse(cities, CITY_COUNT); } else { cout << "无效的选择,请重新运行程序!" << endl; } return 0; } // 输入城市名称的函数 void inputCities(string cities[], int total) { cout << "请输入" << total << "个城市名称:" << endl; for (int i = 0; i < total; i++) { cout << "城市" << i + 1 << ":"; cin >> cities[i]; // 如果需要支持带空格的城市名,把上面的cin换成下面的两行: // cin.ignore(); // 清除换行符 // getline(cin, cities[i]); } } // 正序打印函数 void printInOrder(string cities[], int total) { cout << "\n正序城市列表:" << endl; for (int i = 0; i < total; i++) { cout << "- " << cities[i] << endl; } } // 逆序打印函数(重点:正确的下标范围) void printReverse(string cities[], int total) { cout << "\n逆序城市列表:" << endl; // 从最后一个有效下标(total-1)开始,遍历到0 for (int i = total - 1; i >= 0; i--) { cout << "- " << cities[i] << endl; } }
关键注意点
- 逆序遍历的正确范围:必须从
total-1开始,到i >= 0结束,确保只访问数组内的有效元素。 - 优先用std::string:如果你之前用的是
char*数组,需要手动给每个指针分配内存(比如char* cities[5]; for(int i=0;i<5;i++) cities[i] = new char[50];),还要记得释放内存,新手很容易在这里出错。std::string完全不用操心这些。 - 输入带空格的城市名:如果需要输入像"New York"这样的城市名,要把
cin >> cities[i]换成getline,记得先调用cin.ignore()清除输入缓冲区里的换行符。
你可以对照自己的代码,检查逆序打印的循环条件是不是越界了,换成上面的写法应该就能解决段错误啦!
内容的提问来源于stack exchange,提问作者Shane Spangenberg
相关产品推荐
相关产品推荐

