C++从字符数组追加字符到string失效 提取输入最大数字串问题
问题根因
你写的number.append(1,ch)看不到追加效果的核心原因是string number;定义在了while循环内部,每一轮循环启动时都会重新创建一个空的number对象,上一轮追加的字符会随着循环结束、临时对象销毁直接丢失,自然看不到内容累积的效果。
除此之外代码还有多处逻辑错误,根本无法实现拆分数字、查找最大值的需求:
- if分支缺少花括号:
if (isspace(ch))默认只对紧接的count++语句生效,后面打印number的逻辑无论当前字符是不是空格都会执行,分支判断完全失效 - 遍历终止条件错误:C++的
std::string不保证末尾携带'\0'终止符,用ch != '\0'判断循环结束会触发数组越界的未定义行为 - 缺少数字拆分逻辑:无论当前字符是数字、小数点还是空格,都会被追加到number中,遇到空格时也没有对当前累积的数字做存档、比较、清空的操作
- 类型与返回值不匹配:存储最大值的
greatest被定义为int类型,既无法存储带小数的数值,也不能直接和字符串类型的数字做比较;且函数返回值为int,和需求要求返回最大数字字符串的目标完全不符
修正方案
把number变量挪到循环外定义,遍历字符串时遇到非空格字符就追加到当前number,遇到空格就把当前累积的number和已记录的最大值比较,更新最大值后清空number准备接收下一个数字;循环结束后还要补做一次最后一个数字的比较(输入末尾默认没有空格)。比较数值时可以先把字符串转成double判断大小,但记录结果时要保留原字符串,避免丢失"12.50"这类值末尾的0格式。
修正后的可运行代码:
#include <iostream> #include <string> #include <cctype> #include <sstream> using namespace std; string find_max_number(string sentence1) { string number; string max_str; double max_val = -1e18; // 初始化为足够小的边界值 int i = 0; int len = sentence1.length(); while (i < len) { char ch = sentence1[i]; if (isspace(ch)) { if (!number.empty()) { // 转数值比较大小 double cur_val; istringstream(number) >> cur_val; if (cur_val > max_val) { max_val = cur_val; max_str = number; } number.clear(); // 清空后准备存储下一个数字 } } else { number.append(1, ch); } i++; } // 处理输入末尾最后一个数字(末尾无空格的场景) if (!number.empty()) { double cur_val; istringstream(number) >> cur_val; if (cur_val > max_val) { max_val = cur_val; max_str = number; } } return max_str; } // 测试用例 int main() { string test_input = "12.50 13 14.50 14"; cout << find_max_number(test_input) << endl; // 输出14.50,符合预期 return 0; }
补充说明:如果输入的数字长度超过double能精确表示的范围,可以自行实现字符串形式的数字比较逻辑:先比较整数部分长度,长度更长的数值更大;长度一致则逐位比较字符大小,遇到小数点后单独比较小数部分即可,不需要转数值类型,不会出现精度损失问题。
内容的提问来源于stack exchange,提问作者Ryan Sanchez
相关产品推荐
相关产品推荐

