2013-04-05 57 views
0

我迷路了,試圖找出運行時錯誤。我有一個結構數據類型,並在數組items[]中實現它。在結構中,定義了一個char name。 我還在讀取使用cin的用戶輸入到char數據類型。比較字符會導致總線錯誤

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

如果我去掉if語句,該printf("%c\n", itemname);似乎運行數千次,然後Bus error: 10。注意numofitems是目前剛剛5

從它目前正在編寫方式輸出:

A 
C 
B 
C 
C 
C 
D 
C 
E 
C 

任何想法,爲什麼我不能簡單地比較,如果一個字符相當於另一個?

+0

「總線錯誤」,我相信意味着你正在嘗試使用未正確對齊的內存地址。你可能會超過一些限制。 – 2013-04-05 00:57:52

+0

doh!它與while循環中的代碼無關。 +5 – 2013-04-05 00:58:40

回答

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 2013-04-05 00:58:01

0

沒錯。另請注意,打印出10個字符。每個循環迭代打印兩次,所以循環執行正常,直到我超過numofitems。由於此時'找到==真',循環嘗試第六次迭代,從而導致總線錯誤(更常見地稱爲segmentation fault

1

當您設置「found = true」時,您正在循環運行永遠。或者更改你的循環測試,以便在找到設置時退出,例如:

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

或者在設置找到後放置break語句,例如。

if (items[i].name == itemname) { 
    found = true; 
    break; 
}