c++程序陷入循环

C++ Program stuck in a loop

本文关键字:循环 程序 c++      更新时间:2023-10-16

所以这个程序应该接受一个字符串并将其转换为反向波兰符号,然后为它生成汇编代码。

例如

。如果我输入"x = y",程序将返回

"RPN: xy="

"代码:我很高兴。

然而,程序返回乱码,并继续这样做,直到内存耗尽。

这是输入函数

void 
getstring()
{
    if(datafile) {
        file.getline(str,241);
        }else{
            cout << "Enter a string, please nn";
            cin.getline( str, 241);
            }
            nstring++;
}

这些是与它一起工作的函数

void 
internalize()
{
    int i, j;
    static char inter[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 6, 4, 0, 5, 0, 7,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
                           0,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
                           23,24,25,26,27,28,29,30,31,32,33, 0, 0, 0, 0, 0,
                           0,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
                           49,50,51,52,53,54,55,56,57,58,59, 0, 0, 0, 0, 0};
        char ch, code, k, *p, *q;
        cout << "internal form: nn";
        k=0;
        q=inform;
        for(p=str;*p;p++){
            *q++ = code = inter[(int)*p];
                if(k+code == 0){
                    k = p-str+1;
                    ch = *p;
                    }
            }
        *q = 0;
        for(i=j=0, p = inform;p++,j++;j<len){
        cout << setw(3) << (int)*p;
            if(++i == 16){
                cout << 'n';
                i = 0;
                }
        }   
        if (i !=0){
        cout <<'n';
        }
        if((err = (0<k))!=0){
        cout << 'n**' << (int)k << "-th nonblank char <" <<ch<<"> is illegal. **n";
        }
}
void
makerpn()
{
    static char pr[]={0,0,1,2,3,3,4,4};
    char n, *p, *r, s, *t;
    cout << "nRPN:nn";
    t = stak - 1;
    r = rpn;
    for (p = inform;p++ ; *p){
        if(7 < (s = *p)){
        *r++ = s;
        //a
        }else if(s == 1){
            *++t = s;
        } else{
            while(1){
                if(t<stak){
                    *++t = s;
                    break;
                } else if(pr[s] <= pr[n = *t--]){
                *r++ = n;
                } else if(3 < n+s){
                    *++t = n;
                    *++t = s;
                }
            break;  
            }
    }   
        while(stak <= t){
        *r++ = *t--;
        }
        *r = '';
        for(r=rpn;*r;r++){
            cout << ext[(int)*r];
        }
        cout << "nn";     
}}
void
gencode()
{
        void emit(char, char);
        char a,j,lop,n1,n2,*p,*t;       
        cout << "Generated symbolic code nn";
        j = len = lop = 0;
        t = p = rpn;
            while(3 <(a = *++p)){           
                if(7 <a){
                    *++t = a;
                        if((++lop == 2) && (0<len)){
                        n2=*t--;
                        n1=*t--;
                        *++t=j+60;
                        *++t=n1;
                        *++t=n2;
                        emit(2,(j++)+60);
                        }
                }else {
                    if(lop == 1){
                    emit(a,*t--);
                        }else{ 
                            if( 1 < lop){
                            n2 = *t--;
                            n1 = *t--;
                            emit(1,n1);
                            emit(a,n2);
                            }else {
                                if((a==4) || (a==6)){
                                    n1 = *t--;
                                    emit(a,n1);
                            }else {      
                                n1=*t--;
                                emit(2,j+60);
                                emit(1,n1);
                                emit(a,j+60);
                                if( 59 < n1){
                                    --j;}}}}}}  
                        lop = 0;
}

我猜循环有问题,但我不确定是什么。我已经调整了一段时间,我所能做的就是让它重复Hp?

for (p = inform;p++ ; *p)将继续直到p的下一个值是nullptr,并且每轮将取消对p的引用并丢弃结果-您可能是指另一种方式。

类似的情况是:for(i=j=0, p = inform;p++,j++;j<len)将继续运行,直到j++变成0,并丢弃每次迭代比较j<len的结果。

一般来说,这里只有一个问题:你的代码真的很难读。试着把它分解成可管理的小块,并确认每个小块都在做你想做的事情。这样,如果仍然有单个块没有执行您想要的操作,您可以识别它,并明确地请求该块,而不是转储整个程序。