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

C++ 在不使用内置库函数的情况下添加字符串,我做错了什么?,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:

如果我尝试添加两个值为“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 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为什么要构建一个数字字符串?为什么不改用普通整数运算,然后在完成后将最终整数结果转换为字符串?将整数转换为字符串将忽略前导零。