#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. Да, это сделано намеренно, потому что я хочу запускать его один раз, начиная с каждой итерации