2013-04-05 58 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; 
}