即使在空字符后,也会打印垃圾值

时间:2017-02-10 09:45:19

标签: c++

此代码用于在生产中打印左递归备选方案。但是在添加最后垃圾值的替代品时,为什么我会收到这样的错误?

如何解决此类问题?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;
}

2 个答案:

答案 0 :(得分:3)

makeprod中,您正在检查/的输入字符串,以将终止字符添加到rhs - 数组中,因此您的输入字符串必须以{{1}结尾}} 标志。你有几个选择:

  • 使用0初始化数组,因此/ - 数组始终以空值终止(独立于您的问题:初始化变量总是好的做法)< / p>

  • 当到达输入字符串的末尾时,向rhs添加一个空终止符号(0)

编辑:只需在构造函数中放置rhsmemset(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元素。