2013-04-05 4 views
0

Я потерялся, пытаясь выяснить ошибку времени выполнения. У меня есть тип структуры struct и его реализация в массиве items[]. В структуре существует char name. Я также читаю пользовательский ввод, используя cin, в тип данных .сравнение символов вызывает ошибку шины

i=0; 
do { 
printf("%c\n", items[i].name); 
printf("%c\n", itemname); 

//if (items[i].name == itemname) 
//found=true; 
i++; 
} while (i<numofitems || found); 

если я раскомментировать, если заявление, то printf("%c\n", itemname);, кажется, бежит в тысячи раз с последующим Bus error: 10. обратите внимание, что numofitems является ток только 5.

Выход из пути она в настоящее время написано:

A 
C 
B 
C 
C 
C 
D 
C 
E 
C 

Любая идея, почему я не могу просто сравнить, если один символ эквивалентен другому?

+0

«Ошибка шины», я считаю, вы пытаетесь использовать адрес памяти, который неправильно выровнен. Вероятно, вы преодолеваете какой-то предел. –

+0

doh! он не имеет ничего общего с кодом в цикле while. +5 –

ответ

4

Ваше состояние должно быть i<numofitems && !found. Прямо сейчас, если это правда, он продолжает цикл, а found становится истинным на третьей итерации.

Я бы переписать его, как это:

for (int i = 0; i <numitems; ++i) 
    std::cout << items[i].name << '\n'; 
    std::cout << itemname << '\n'; 

    if (items[i].name == itemname) 
     break; 
} 
2

Как упоминает @chris, ваше условие прекращения выглядит неправильно. Если вы установите значение true, цикл никогда не завершится.

+0

Прошу прощения. Этот комментарий должен был быть ответом с самого начала. – chris

0

Yep. Также обратите внимание, что распечатывается 10 символов. Каждая итерация цикла печатается дважды, поэтому цикл выполняется отлично, пока я не превысит число элементов. Так как «found == true» в этой точке, цикл пытается выполнить итерацию в шестой раз, вызывая ошибку шины (более известный как segmentation fault)

1

Когда вы устанавливаете «found = true», вы выполняете цикл навсегда. Либо изменить тест петли, так что вы выйти, когда найдено установлен, например,

} while (i < numofitems && found == false); 

или поместить заявление перерыва после того, как настройка найдено, например.

if (items[i].name == itemname) { 
    found = true; 
    break; 
} 
Смежные вопросы