【问题标题】:Why does my code enter into an infinite loop at the initial nested for loop on execution?为什么我的代码在执行时的初始嵌套 for 循环中进入无限循环?
【发布时间】:2020-09-20 11:30:13
【问题描述】:

我试图纠正的这段代码是针对 Hackerrank 上的 C++ 程序的属性解析器问题。 代码还没有完成,因为我一次又一次地进入这个可怕的无限循环,因为我无法解决它。

代码:

struct tag{
    char name[100];
    char att[100][100];
    char val[100][100];
};

int main(){

    tag tags[100];
    char line[200];
    int n,q;
    cin>>n>>q;

    int a,b,c,flag;
    a=0;

    for(int i=0;i<n;i++){
        cin.getline(line,200);

        b=c=flag=0;

        int j;
        if(flag==0){
            for(j=1;line[j]!=' '||line[j]!='>';j++)
               {tags[a].name[j]=line[j];
                cout<<"!";
                }
            flag=1;
        }
        else if(flag==1){
            while(line[j]!='>'){
                for(j+=1,c=0;line[j]!=' '||line[j]!='=';j++,c++){
                    tags[a].att[b][c]=line[j];
                }
                while(line[j]!='"')
                    j++;

                for(j+=1,c=0;line[j]!='\"';j++,c++){
                    tags[a].val[b][c]=line[j];
                }
                b++;
            }
            a++;
        }
    }

    cout<< tags[0].name[0];
    return 0;
}

另外,我是 Coding 的新手。建设性的批评将不胜感激:))

【问题讨论】:

  • 给变量起有意义的名字。例如,flag 不会告诉读者该变量的作用。作为猜测(并且需要猜测说明了问题),它可能是first_time

标签: c++ arrays string parsing


【解决方案1】:

在这种情况下:

line[j]!=' ' || line[j]!='>'

对于line[j] 的任何值,析取条件之一将为真。这会导致无限循环。

您正在寻找:

line[j]!=' ' && line[j]!='>'

【讨论】:

    【解决方案2】:
    for(j=1;line[j]!=' '||line[j]!='>';j++) 
    

    应该是

    for(j=1;line[j]!=' '&& line[j]!='>';j++)
    

    你也永远不会进入 else 部分,因为在迭代开始时你设置 flag==0 并且 if(flag==0) 总是为真

    【讨论】:

    • 但是我在检查 flag==0 的函数中将标志设置为 1。所以,我想我可以进入 else 块。
    • 你设置 flag=1,没关系。但在下一次迭代开始时,标志将再次初始化为 0 ( b=c=flag=0; ),然后再检查条件。让我知道您的 else 块是否正在执行此更改。
    • 是的,这是故意的,因为我想在每次迭代开始时运行一次
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 2019-04-22
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多