Почему мой код вступает в бесконечный цикл в начальном вложенном цикле for при выполнении?

#c #arrays #string #parsing

#c #массивы #строка #синтаксический анализ

Вопрос:

Этот код, который я пытаюсь исправить, относится к вопросу о анализаторе атрибутов для программы C на Hackerrank. Код еще не завершен, поскольку я снова и снова перехожу в этот ужасный бесконечный цикл, поскольку я не могу его решить.

Код:

 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;
}
  

Кроме того, я новичок в программировании и все такое. Конструктивная критика будет оценена по достоинству :))

Комментарии:

1. Дайте переменным значимые имена. Например, flag не сообщает читателю, что делает эта переменная. Как предположение (и необходимость угадывать иллюстрирует проблему), это может быть first_time .

Ответ №1:

В этом условии:

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

для любого значения line[j] одно из условий дизъюнкции будет истинным. Это приводит к бесконечному циклу.

Вы ищете:

 line[j]!=' ' amp;amp; line[j]!='>'
  

Ответ №2:

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

должно быть

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

Также вы никогда не попадаете внутрь раздела else, потому что в начале итерации вы устанавливаете flag==0, а if(flag==0) всегда будет true

Комментарии:

1. Но я устанавливаю флаг равным 1 в функции, где я проверяю flag==0 . Итак, я думаю, я смог бы ввести блок else .

2. вы устанавливаете flag=1, все в порядке. Но в начале следующей итерации flag снова инициализируется значением 0 ( b = c =flag=0; ), Прежде чем проверять условие. Дайте мне знать, выполняется ли ваш блок else с этим изменением.

3. Да, это сделано намеренно, потому что я хочу запускать его один раз, начиная с каждой итерации