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

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;
    }
}

关键注意点

  1. 逆序遍历的正确范围:必须从total-1开始,到i >= 0结束,确保只访问数组内的有效元素。
  2. 优先用std::string:如果你之前用的是char*数组,需要手动给每个指针分配内存(比如char* cities[5]; for(int i=0;i<5;i++) cities[i] = new char[50];),还要记得释放内存,新手很容易在这里出错。std::string完全不用操心这些。
  3. 输入带空格的城市名:如果需要输入像"New York"这样的城市名,要把cin >> cities[i]换成getline,记得先调用cin.ignore()清除输入缓冲区里的换行符。

你可以对照自己的代码,检查逆序打印的循环条件是不是越界了,换成上面的写法应该就能解决段错误啦!

内容的提问来源于stack exchange,提问作者Shane Spangenberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:35:16