2015-10-09 24 views
0

在这种方法中,我正在查看一个字符串是否出现在单词搜索中。由于一个字符串可以出现在任何方向,我有以下方法检查这些方向:如果语句被跳过

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

网格我与长相的工作是这样的:

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

的X,Y和在运行时(只是段错误之前)STR值是:

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

现在的strlen(海峡)评估为3并且x - 3评估为-3。

-3 < 0将评估真实并退出我的方法。不幸的是,该方法开始处的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; 
} 
+1

你为什么要做'strlen(str)'?使用'str.length()'(这是*** std :: string ***,对吧?) – Amit

+0

@Amit:在C?你在想什么? –

+0

@Amit这是C代码,所以我敢打赌'string'确实是'char *'的'typedef'。 –

回答

8

由于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++) { 

这保证了长度只计算一次,除非你在某个函数修改字符串,或者它调用的功能之一是足够的。

+0

'for(size_t i = 0; str [i]; i ++){'应该会更好。 – mch

+0

@mch:是的,那些小的变体也会起作用(尽管初始长度检查需要'strlen()')。性能可能不是一个主要的问题,即使在原来写入的循环。字符串的大小足够小,不会成为重复'strlen()'的主要问题。如果字符串将是多千字节或更大,那么它会增加一个可衡量的成本 - 除非编译器足够聪明,能够优化'strlen()'超出循环条件。我不会依靠这种可能,但我也不会排除这一点。 –