在不使用内置库函数的情况下添加字符串,我做错了什么?

add strings without using builtin library function, what am i doing wrong?

本文关键字:字符串 错了 什么 添加 情况下 内置 库函数      更新时间:2023-10-16

如果我尝试添加两个字符串 x 和 y 的值为"0"1",则此函数的结果数字值为"01"。如果我尝试使用 resultnum.find_first_of("0"(,它将位置返回为 -1 而不是 0 ....我只想摆脱那个领先的零,我无法摆脱它......也许我正在犯一些愚蠢的错误,但请帮助我确定为什么它在结果中返回 -1 作为 0 的位置。

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]='';
}
}
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 的原因。

非常感谢您的建议和回复。我确实将上面的代码更改为不使用 [] 运算符,只是添加到字符串中,最后反转字符串,现在代码运行良好。我非常感谢你:).

string addStrings(string num1, string num2) {
char carry = {0};
std::string resultnum;

char x={0},y={0};
char z={0};

long loopUnitl=std::max(num1.size(),num2.size());
long maxSize = loopUnitl+1;
resultnum ="";
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 += (z+'0');
loopUnitl=loopUnitl-1;
if(loopUnitl==0)  
{  
if(carry)
resultnum += (carry+'0');
}
}
std::reverse(resultnum.begin(),resultnum.end());
return resultnum;
}