[英]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.