此代码用于在生产中打印左递归备选方案。但是在添加最后垃圾值的替代品时,为什么我会收到这样的错误?
如何解决此类问题?in the image the output is displayed.but that is the wrong output
#include<iostream>
#include<cstring>
using namespace std;
class production
{
private:
char lhs;
char rhs[10][10],lr[10][10];
int noa;
public:
production()
{
noa=0;
}
void makeprod(char *str)
{
lhs=str[0];
char r[20];
strcpy(r,str+3);
int j=0;
for(int i=0;r[i]!='\0';i++)
{
if(r[i]!='/')
rhs[noa][j++]=r[i];
else
{
rhs[noa++][j]='\0';
j=0;
}
}
noa++;
}
void checkLR()
{
int ct=0,m=0;
for(int i=0;i<noa;i++)
if(lhs==rhs[i][0])
{
strcpy(lr[m],rhs[i]);
m++;
ct++;
}
if(ct>0)
{
for(int k=0;k<ct;k++)
cout<<"Left recursion at "<<lr[k]<<"\n";
}
else
cout<<"no\n";
}
void printprod()
{
cout<<"LHS = "<<lhs<<"\n";
cout<<"RHS = ";
for(int i=0;i<noa;i++)
cout<<rhs[i]<<" ";
}
};
int main()
{
production p;
char str[20];
cout<<"enter a production\n";
cin>>str;
p.makeprod(str);
p.printprod();
p.checkLR();
return 0;
}
答案 0 :(得分:3)
在makeprod
中,您正在检查/
的输入字符串,以将终止字符添加到rhs
- 数组中,因此您的输入字符串必须以{{1}结尾}} 标志。你有几个选择:
使用0初始化数组,因此/
- 数组始终以空值终止(独立于您的问题:初始化变量总是好的做法)< / p>
当到达输入字符串的末尾时,向rhs
添加一个空终止符号(0)
编辑:只需在构造函数中放置rhs
(memset(rhs, 0, sizeof(rhs)*sizeof(char));
相同),输出就可以了。这将使用零初始化数组,因此字符串以空值终止。
但是你真的应该添加一些溢出检查。
答案 1 :(得分:0)
您noa
中的makeprod()
一次可能会增加printprod()
次
这使得<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
中的for循环在其结束后访问rhs 1元素。