繁体   English   中英

如果语句被跳过

[英]If statement being skipped

在这种方法中,我希望查看单词搜索中是否出现字符串。 由于字符串可以沿任何方向出现,所以我有类似以下方法的方法可以检查这些方向:

目前,我的代码在运行时出现分段错误。 发生这种情况是因为根据gdb跳过了我方法中的第一个if语句。

我正在使用的网格如下所示:

a r e o 
o n l y
o d d a

在运行时(就在segfault之前)x,y和str的值是:

x = 0;
y = 0;
str = "add"

现在strlen(str)的值为3, x - 3值为-3。

-3 < 0将评估为true并退出我的方法。 不幸的是,方法开头的if语句在运行时被跳过。 有人知道发生了什么吗?

此外,如果我将网格的第一行更改为:

q r e o

我得到适当的结果。

方法如下:

bool checkNorth (int x, int y, string str) {
  //Deal with trival case and avoid array out of bounds/checking silly things
  if (x-strlen(str) < 0){
    return false;
  }
  //for each character in str 
  for (int i = 0; i < (strlen(str)); i++){
    //If the character above in the grid is the next character in the string
    if (grid[x-i][y].letter == str[i]){
      //keep going
      continue;
    }else{
      //It ain't north
      return false;
    }
  }
  //It's north
  return true;
}

由于strlen()返回的是size_t类型的值,该值是无符号的,因此您计算x - 3 ,将对无符号的值进行计算,并且使用无符号算术, 0 - 3是一个较大的正值,并且永远不会小于零。 实际上,由于比较是针对小于0的无符号数量,但无符号数量永远不能为负,因此编译器可以优化整个if测试,然后完全取消随后的return

您可以通过以下方法解决问题:

if (x-strlen(str) < 0){

至:

if (x < strlen(str)) {

请注意,您的循环效率不高。 你有:

for (int i = 0; i < (strlen(str)); i++){

这将在每次迭代时重新计算strlen(str) 您可以这样写:

size_t len = strlen(str);

for (size_t i = 0; i < len; i++) {

这样可以保证长度仅计算一次,除非您在函数或函数调用的某个函数中修改字符串,否则该长度就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM