gpt4 book ai didi

c++ string.length() 作为 string.at() 参数超出范围

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:00 25 4
gpt4 key购买 nike

所以我一直在研究一个反转它的字符的程序。我是通过 string.length() 和 string.at() 来完成的。但是,即使它没有超出范围,它也会出现“超出范围”的错误(我已经通过打印 at variabele 的 pos 来检查它)我怀疑这是由于数据类型不匹配造成的。如我错了请纠正我。这是我的代码。

 #include "pch.h"
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

string compose(string temp) {
size_t temp1 = 0, temp2 = temp.length() - 1;
string temporary, temporary1;
cout << temp2;
while (temp2 < temp.length() / 2 + 1 || temp2 > temp.length() / 2 - 1) {
temporary1 = temp.at(temp1);
temporary = temp.at(temp2);

temp.replace(temp1, 1, temporary);
temp.replace(temp2, 1, temporary1);
temp1++;
temp2--;
}
return temp;
}

int main()
{

cout << compose("RPL X-1okewphevoiwrwrejfnjjjjjjjjjjjjjjjjjnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn");
_getch();
return 0;
}

最佳答案

改变这个:

while (temp2 < temp.length() / 2 + 1 || temp2 > temp.length() / 2 - 1)

到:

while (temp2 < temp.length() / 2 - 1 || temp2 > temp.length() / 2 - 1)

解释:

I've checked it by print the pos of at variabele

您的支票金额不足。我做了一个:

cout << temp1 << " " << temp2 << endl;

在 while 循环体的第一行,很明显 temp2 underflowing,这解释了超出范围的错误。

您所做的是强制 size_t(将其想象为无符号整数)变量低于 0。阅读更多信息 Question about C behaviour for unsigned integer underflow .

为了解决这个问题,您需要了解是什么让您的 temp2 下溢。在循环结束时,您执行 temp2--;, 将 temp2 减 1。

您应该通过在 while 循环中设置停止条件来控制执行次数。这种方法使我们能够专注于 while 循环中的停止条件。

使用像“bar”这样的输入,而不是你在那里使用的那个大字符串,你可以很容易地看到,当它被反转为“rab”时,temp1 等于 2 并且temp2 等于 0。

如果您允许 的循环体再次执行,您将允许 temp2 下溢,调用未定义行为 (UB),当您尝试使用 temp2

检查停止条件和计数器的值,您可以看到您需要更改 OR 条件的第一个操作数,如上所述。


家庭作业:思考如何简化停止条件。以一个小字符串作为示例输入,看看计数器 temp1temp2 如何 self 更新。

提示:一个条件就足够了(您不需要将两个条件与逻辑或配对)。


PS:既然我们讨论了下溢,现在有人自然会认为必须确保 temp 不为空。如果是,那么 temp2 = temp.length() - 1; 将导致 temp2 下溢!

因此,修改您的函数以在其第一行 if(temp.length() == 0) return ""; 中执行。

关于c++ string.length() 作为 string.at() 参数超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53412090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com