我正在为我的arduino项目开发一个迷宫求解器机器人。我希望我的机器人记住迷宫,然后找到最短的路径。当char数组的长度为3时,我一直遇到问题。
当长度为<= 3时出现问题,所以我尝试了不同的东西来制作一个特殊的案例,这就是if (strlen(a) > 3)
在这里的原因。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
char a[] = "LLLBLLLRBLLBSRSRS";
char b[200];
while(strcmp(a, b) != 0) {
strcpy(b, a); //sa verific daca se schimba sirul, daca nu inseamna ca a ajuns la minim
for(int i = 0; i < strlen(a) - 2; i++)
{
if(a[i] == 'L' && a[i + 1] == 'B' && a[i + 2] == 'R') //if urile astea cauta combinatii de cate 3 miscari sa optimizezi drumul
{
a[i] = 'B';
if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
else a[i + 1] = '\0';
}
else if(a[i] == 'L' && a[i + 1] == 'B' && a[i + 2] == 'S')
{
a[i] = 'R';
if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
else a[i + 1] = '\0';
}
else if(a[i] == 'L' && a[i + 1] == 'B' && a[i + 2] == 'L')
{
a[i] = 'S';
if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
else a[i + 1] = '\0';
}
else if(a[i] == 'S' && a[i + 1] == 'B' && a[i + 2] == 'L')
{
a[i] = 'R';
if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
else a[i + 1] = '\0';
}
else if(a[i] == 'S' && a[i + 1] == 'B' && a[i + 2] == 'S')
{
a[i] = 'B';
if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
else a[i + 1] = '\0';
}
else if(a[i] == 'R' && a[i + 1] == 'B' && a[i + 2] == 'L')
{
a[i] = 'B';
if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
else a[i + 1] = '\0';
}
}
cout << a << endl;
}
return 0;
}
这是输出:
LLSLLBRRSRS LLSLBRSRS 最小二乘 最低工资标准 LBS
,然后显示错误消息运行时错误(退出状态:139(无效的内存引用))。
目标是使最后一个输出为R,因为LBS表示R。 感谢您的关注!
答案 0 :(得分:0)
无效的内存引用的原因在于循环条件:
for(int i = 0; i < strlen(a) - 2; i++)
您正在循环内访问a[i + 2]
,因此最后一次迭代必须在i < strlen(a) - 3
处结束:
for(int i = 0; i < strlen(a) - 3; i++)
这只会解决您的内存问题。您仍然get LBS
作为最后一个输出。