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

C++使用std::cin读取空格分隔变长数字存入int数组并执行倒序排序

解决方案

核心修改点

  • 输入读取:C++的cin默认会自动跳过空格、换行符等空白字符,直接循环读取int类型值即可自动完成按空格分割的逻辑,不需要手动拆分字符串。用vector<int>存储输入的数字可天然适配变长需求,不需要提前指定长度。
  • 排序逻辑优化:将原递归版冒泡排序改为迭代版,把原本的全局变量sorted、temp移入函数内部,避免全局状态污染,同时加入提前终止逻辑,保证排序只会执行必要的轮次,不会出现重复执行的问题。
  • 修复原代码隐患:原代码中的全局指针arr未分配内存直接访问会触发崩溃,写死的arrLength也无法适配变长输入,修改后直接从输入的数字集合获取长度,无需手动定义。

可运行完整代码

#include <iostream>
#include <vector>
#include <sstream>
#include <string>

using namespace std;

void reverseSort(int arr[], int n){
    for (int i = 0; i < n-1; i++){
        bool sorted = true;
        // 每轮排序后最后i位已经有序,不需要再比较
        for (int j = 0; j < n - 1 - i; j++){
            if (arr[j + 1] > arr[j]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                sorted = false;
            }
        }
        // 本轮没有发生交换说明已经完全有序,直接退出
        if (sorted) {
            break;
        }
    }
}

int main(void){
    vector<int> inputNums;
    // 方式1:读取所有输入的数字,直到遇到结束符/非数字
    // int num;
    // while (cin >> num) {
    //     inputNums.push_back(num);
    // }

    // 方式2:仅读取一行输入的数字,按空格拆分
    string line;
    getline(cin, line);
    stringstream ss(line);
    int num;
    while (ss >> num) {
        inputNums.push_back(num);
    }

    int arrLength = inputNums.size();
    if (arrLength == 0) {
        cout << "未输入有效数字" << endl;
        return 0;
    }

    // 如果你需要使用原生int数组,直接取vector的底层指针即可
    int* arr = inputNums.data();
    reverseSort(arr, arrLength);

    // 输出排序结果
    for (int i = 0; i < arrLength; i++){
        cout << arr[i] << " ";
    }
    cout << endl;
    
    return 0;
}

其他说明

如果不想用vector,也可以先统计输入的数字个数,再用new int[长度]申请动态数组存储输入值,用完后记得用delete[]释放内存即可,相比之下vector会自动管理内存,使用更安全。

内容的提问来源于stack exchange,提问作者Lukas Guldstøv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:06:04