【问题标题】:comparing characters causes a bus error比较字符会导致总线错误
【发布时间】:2013-04-05 00:49:52
【问题描述】:

我在试图找出运行时错误时迷失了方向。我有一个结构数据类型,并在数组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

知道为什么我不能简单地比较一个字符是否等同于另一个字符吗?

【问题讨论】:

  • “总线错误”,我相信这意味着您正在尝试使用未正确对齐的内存地址。你可能会超过一些限制。
  • 哇!它与while循环中的代码无关。 +5

标签: c++ char


【解决方案1】:

您的条件应该是i&lt;numofitems &amp;&amp; !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 所提到的,您的终止条件看起来是错误的。如果将 found 设置为 true,则循环将永远不会终止。

    【讨论】:

    • 我很抱歉。该评论从一开始就应该是一个答案。
    【解决方案3】:

    当您设置“found=true”时,您将让循环永远运行。要么改变你的循环测试,所以你在找到时退出,例如

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

    或在找到设置后放置一个break语句,例如。

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

    【讨论】:

      【解决方案4】:

      是的。另请注意,打印出 10 个字符。每个循环迭代打印两次,因此循环执行良好,直到 i 超过 numofitems。由于此时'found == true',循环尝试第六次迭代,导致总线错误(通常称为segmentation fault

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 2014-09-02
        • 2014-11-28
        相关资源
        最近更新 更多