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

