C++ 在不使用内置库函数的情况下添加字符串,我做错了什么?
如果我尝试添加两个值为“0”“1”的字符串x和y,则此函数的resultnum值为“01”。如果我尝试使用resultnum.find_first_of(“0”),它会将位置返回为-1,而不是0。。。。我只想去掉前导零,但我无法去掉它。。。也许我犯了一些愚蠢的错误,但请帮助我确定为什么结果中0的位置返回-1C++ 在不使用内置库函数的情况下添加字符串,我做错了什么?,c++,C++,如果我尝试添加两个值为“0”“1”的字符串x和y,则此函数的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 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()
。
您使用运算符[]
将字符插入结果num
是未定义的行为,因为访问字符的有效范围是[0,size())
,而不是[0,capacity())
(您是否使用了at()
方法而不是运算符[]
,您的代码将引发异常,警告您索引超出范围)
或者,如果要继续使用reserve()
,则应使用insert()
方法在每次循环迭代中向字符串前面添加字符,而不是使用运算符[]
字符串的size()()
由于字符串的size()
从不>0,因此find\u first\u of()
返回-1。您需要使用resultnum.resize()
而不是resultnum.reserve()
。
您使用运算符[]
将字符插入结果num
是未定义的行为,因为访问字符的有效范围是[0,size())
,而不是[0,capacity())
(您是否使用了at()
方法而不是运算符[]
,您的代码将引发异常,警告您索引超出范围)
或者,如果要继续使用reserve()
,则应使用insert()
方法在每次循环迭代中向字符串前面添加字符,而不是使用运算符[]
字符串的size()()
由于字符串的
size()
从来都不是>0,这就是为什么find\u first\u 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;
}
非常感谢您的建议和回复。我确实将上述代码更改为不使用[]运算符,并将其添加到字符串中,最后将字符串反转,现在代码工作正常。我非常感谢您:)
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;
}
我不太清楚你在问什么。你试图添加两个字符串,“0”和“1”,你想得到的字符串只是“1”?你真正想做的是什么,因为这感觉像是一个XY问题。我正在添加两个字符串,希望结果是“1”,但我的结果是“01”,因为下面的一行,resultnum[loopUnitl]=carry+'0';如果我添加值为“99”和“1”的字符串,其中我得到的结果为100,则效果很好。因此,我尝试将substr从1提取到字符串的长度,忽略第一个字符为零,但这不起作用,如果我尝试得到子字符串resultnum.substr(1,resultnum.size())……并且如果我确实找到了(“0”的第一个字符,则结果为空字符串)结果是-1而不是0。为什么find_首先是(“0”)返回-1而不是0?@GirijaRam为什么要构建一个数字字符串?为什么不使用普通的整数运算,然后在完成后将最终的整数结果转换为字符串?将整数转换为字符串会忽略前导零。我不太清楚你在问什么。你正在尝试添加两个字符串,“0”和“1”,您希望结果字符串仅为“1”?您真正想做的是什么,因为这感觉像是一个XY问题。我正在添加两个字符串,希望结果为“1”,但我的结果为“01”,因为下面的行是resultnum[loopUnitl]=carry+'0';如果我添加值为“99”和“1”的字符串,效果很好在这里,我得到result=100,所以我尝试将substr从1提取到字符串的长度,忽略第一个字符为零,但这不起作用,如果我尝试得到子字符串resultnum.substr(1,resultnum.size())……我得到的结果是空字符串,如果我确实找到了“0”的“u first”,那么结果是-1而不是0。为什么找到“0”的“u first”返回-1而不是0?@GirijaRam为什么要构建一个数字字符串?为什么不改用普通整数运算,然后在完成后将最终整数结果转换为字符串?将整数转换为字符串将忽略前导零。