2015-10-09 142 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()'超出循環條件。我不會依靠這種可能,但我也不會排除這一點。 –