C++程序列数≥10触发std::out_of_range错误,求解决方案
问题分析与解决方案
错误原因
你遇到的std::out_of_range异常是因为stoi函数的转换范围限制:stoi将字符串转换为int类型,而int的最大值通常是2147483647(仅能容纳10位数字里的小部分值)。当列数≥10时,生成的数字字符串可能达到或超过10位(比如10位最大值是9999999999),远超出int的上限,直接触发越界异常。
当前实现的合理性
这种先拼接字符串再用stoi转整数的实现仅适用于列数≤9的场景,一旦列数超过9就会触发范围错误,所以确实不合理,需要更换实现方法。
推荐的替代方案
方案1:改用更大范围的整数转换函数
如果坚持保留字符串拼接的逻辑,可以把stoi换成支持更大数值范围的函数:
stoll:转换为long long类型(最大值约9e18,支持最多18位数字)stoull:转换为无符号unsigned long long类型(最大值约1.8e19,支持最多19位数字)
示例代码片段:
// 原错误写法 string num_str = "12345678901"; // 11位数字 // int num = stoi(num_str); // 触发异常 // 修正后 long long num = stoll(num_str); // 正常转换
方案2:直接生成数值(更优)
不需要拼接字符串,在生成随机数字的过程中直接计算每行的数值,从根本上避免字符串转换的问题,效率也更高:
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0)); // 初始化随机数种子 int rows, cols; cout << "输入行数和列数(格式:行数 列数):"; cin >> rows >> cols; long long total_sum = 0; for (int row = 0; row < rows; ++row) { long long current_num = 0; cout << "第" << row + 1 << "行数字:"; for (int col = 0; col < cols; ++col) { int digit = rand() % 10; cout << digit; current_num = current_num * 10 + digit; // 逐位构建数值 } cout << endl; total_sum += current_num; } cout << "所有行的总和:" << total_sum << endl; return 0; }
这个方法通过current_num = current_num *10 + digit逐位累加构建数值,直接得到每行的数字,不需要字符串中间环节,同时用long long存储,能支持最多18位数字的列数需求。如果列数超过18位,还可以考虑用unsigned long long或者第三方大数库处理超大数值。
内容的提问来源于stack exchange,提问作者Shrimpu28
相关产品推荐
相关产品推荐

