在不使用内置库函数的情况下添加字符串,我做错了什么?
add strings without using builtin library function, what am i doing wrong?
如果我尝试添加两个字符串 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;
}
相关文章:
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 首要问题的答案让值班员搞错了
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 我的C++线程做错了什么?
- 如何正确使用 >=?(a+f()+c)>=0 错了吗?
- 谁能告诉我我用 getline 做错了什么 (cpp) 格式
- 没有输出的合并排序我做错了什么?
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 我用字符串做了一个C++构造函数,但它不会打印出字符串
- 我做错了什么?反向字符串 C++
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 我在查找和字符串上做错了什么?
- 我在 c++ 中组合了两个字符串,但放错了
- std::字符串类查找函数不返回预期结果.我可能用错了
- 如何正确地将std::字符串转换为无符号char[]数组*.我觉得我做错了,有人给我指明了正确的方向
- 我做错了什么?(C++字符串)
- 使用字符串**创建地图。我想我走错了路
- 使用ICU库解析字符串中的时间戳,我做错了什么