C++中Auto_Padding函数的字符串数组为何将字符串04转为00
C++大数字运算代码错误修复
核心错误点
Arithmetic_Multiply返回值错误
函数计算完累加结果存在变量val中,但最后返回的是输入的第二个参数val2,直接导致输入Arithmetic_Multiply("4","5")返回5而非预期的计算结果。Auto_Padding返回static局部数组的生命周期问题
函数内定义的static string to_return[3]属于静态局部变量,仅会在第一次调用函数时初始化,后续所有调用该函数返回的都是同一块内存地址,且内容不会更新,多次调用Auto_Padding时获取的都是第一次调用的结果,导致加法计算逻辑异常。
修复后的可运行代码
#include <string> #include <iostream> #include <stdlib.h> #include <math.h> #include <vector> using namespace std; string Add_Padding(string val, int padding_amount) { string result = ""; for (int i = 0; i < padding_amount; i++) { result += "0"; } return result.append(val); } // 改用vector返回规避静态数组生命周期问题 vector<string> Auto_Padding(string val1, string val2) { int val1L = val1.length(); int val2L = val2.length(); if (val1L > val2L) { val2 = Add_Padding(val2, val1L - val2L); val1.insert(0, "0"); val2.insert(0, "0"); return {val1, val2, to_string(val1L)}; } else if (val1L < val2L) { val1 = Add_Padding(val1, val2L - val1L); val1.insert(0, "0"); val2.insert(0, "0"); return {val1, val2, to_string(val2L)}; } else { val1.insert(0, "0"); val2.insert(0, "0"); return {val1, val2, to_string(val1L)}; } } string Arithmetic_Add(string tempVal1, string tempVal2) { vector<string> values = Auto_Padding(tempVal1, tempVal2); string val1 = values[0]; string val2 = values[1]; int loop_amount = stoi(values[2]); int carry = 0; int currentResult; int tempVar; string result = ""; for (int i = loop_amount; -1 < i; i--) { currentResult = carry + (val1[i] - '0') + (val2[i] - '0'); if (currentResult > 9) { carry = floor(currentResult / 10); tempVar = currentResult % 10; result.insert(0, to_string(tempVar)); } else { carry = 0; result.insert(0, to_string(currentResult)); } } if (result[0] == '0') { result.erase(0, 1); } return result; } string Arithmetic_Multiply(string val1, string val2) { int loop_amount = stoi(val2); string val = "0"; for (int i = 0; i < loop_amount; i++) { val = Arithmetic_Add(val, val1); } // 修正返回值为计算得到的val return val; } int main() { cout << Arithmetic_Multiply("4", "5"); // 输出20,符合预期 cout << endl; cout << flush; return 0; }
内容的提问来源于stack exchange,提问作者simpl360
相关产品推荐
相关产品推荐

