LeetCode复数乘法题中stoi()触发invalid_argument报错求助
解决stoi解析复数时的invalid_argument错误
首先看你代码里的几个关键问题,这也是导致报错的核心原因:
1. 变量混淆:错误复用字符串a处理第二个复数b
你代码里的a2和b2都是从a中截取的,但它们本该对应第二个复数b的实部和虚部。比如:
int a2 = stoi(a.substr(0, bplus), nullptr); // 这里应该用b.substr,不是a.substr int b2 = stoi(a.substr(bplus + 1, bi), nullptr); // 同样,这里必须用b.substr
这种混淆会导致处理第二个复数时,取到的是第一个复数的内容,完全不符合预期,自然会让stoi解析错误的字符串。
2. substr的第二个参数用错了:它是长度,不是结束索引
string::substr(pos, len)的第二个参数是截取的长度,而非结束位置。你之前直接传了ai或bi(也就是'i'的索引),这会导致截取的字符串长度远超实际需要,甚至包含'i'字符或者超出字符串范围,stoi遇到非数字字符就会抛出invalid_argument。
比如对于"-1+-1i",aplus是1,ai是4,a.substr(aplus+1, ai)会从索引2开始截取4个字符,但原字符串总长度仅为5,实际截取的是"-1i",stoi无法解析包含'i'的字符串,直接报错。
修正后的完整代码
下面是修复后的代码,我标注了关键修改点:
class Solution { public: string complexNumberMultiply(string a, string b) { // 处理第一个复数a int a_plus = a.find('+'); int a_i = a.find('i'); int a_real = stoi(a.substr(0, a_plus)); // 实部:从开头截取到'+'位置 // 虚部:从'+'后开始,截取到'i'前,长度为i的位置减去+1的位置 int a_imag = stoi(a.substr(a_plus + 1, a_i - (a_plus + 1))); // 处理第二个复数b(修复了之前混淆a和b的问题) int b_plus = b.find('+'); int b_i = b.find('i'); int b_real = stoi(b.substr(0, b_plus)); // 用b.substr获取b的实部 int b_imag = stoi(b.substr(b_plus + 1, b_i - (b_plus + 1))); // 用b.substr获取b的虚部 // 复数乘法计算逻辑 int res_real = a_real * b_real - a_imag * b_imag; int res_imag = a_real * b_imag + b_real * a_imag; return to_string(res_real) + "+" + to_string(res_imag) + "i"; } };
额外小优化
其实虚部的截取可以简化写法,只要明确截取到'i'之前即可,比如:
int a_imag = stoi(a.substr(a_plus + 1, a_i - a_plus - 1));
这样不管实部和虚部是正数还是负数,stoi都能正确解析带负号的数字字符串,测试"-1+-1i"、"1+-1i"这类输入都不会再报错。
内容的提问来源于stack exchange,提问作者Drashti




