如果我尝试将两个字符串 x 和 y 与值“0”“1”相加,则此函数的 resultnum 值为“01”。如果我尝试使用 resultnum.find_first_of("0") 它返回位置为 -1 而不是 0 .... 我只想摆脱那个前导零,我无法摆脱它......也许我是犯了一些愚蠢的错误,但请帮助我确定为什么结果为 0 的位置返回 -1。
string addStrings(string num1, string num2) {
char carry = {0},x={0},y={0},z={0};
std::string resultnum;
long loopUnitl=std::max(num1.size(),num2.size());
long maxSize = loopUnitl+1;
resultnum.reserve(maxSize);
std::string::reverse_iterator rnum1_it=num1.rbegin();
std::string::reverse_iterator rnum2_it=num2.rbegin();
while(loopUnitl)
{
if(rnum1_it != num1.rend())
{
x = *rnum1_it;
rnum1_it++;
}
else
{
x = '0';
}
if(rnum2_it != num2.rend())
{
y = *rnum2_it;
rnum2_it++;
}
else
y = '0';
z = (x -'0') + (y - '0') + carry;
if (z > 9)
{
carry = 1;
z -= 10;
}
else
{
carry = 0; //Else no carry was generated
}
resultnum[loopUnitl] = (z+'0');
loopUnitl=loopUnitl-1;
if(loopUnitl==0)
{
resultnum[loopUnitl] = carry+'0';
resultnum[maxSize]='\0';
}
}
return resultnum;
}
resultnum.resize()
而不是resultnum.reserve()
.您使用operator[]
将字符插入resultnum
是未定义行为,因为访问字符的有效范围是[0, size())
,不是[0, capacity())
(如果您使用该at()
方法而不是operator[]
,您的代码会引发异常警告您索引超出范围)。
或者,如果您想继续使用reserve()
,您应该使用insert()
方法在每次循环迭代时将字符添加到字符串的前面,而不是使用operator[]
。
字符串的size()
和capacity()
是两个不同的东西。这capacity()
是字符串物理分配了多少内存来保存字符,但size()
这些字符中有多少是实际有效的数据。像搜索这样的操作作用于size()
,而不是capacity()
。
由于字符串size()
永远不会 > 0,这就是find_first_of()
返回 -1 的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句