2014-03-14 12 views
0

我試圖找到兩個單詞之間的前綴,但似乎我所擁有的是不正確的。首先if(strlen(root) == 0)總是評估爲0.爲什麼?
Char陣列不是空的時候應該是

The longest common prefix of astrophysics and math is 0��. // <<--- why does this get printed? // 
+2

'root'永遠不會初始化任何在此代碼,如果這兩個詞都沒有領先的相似字符,即使他們有*類似的字符也不會被終止。 while-loop'printf'也會調用未定義的行爲,因爲您發送的數據是字符串格式說明符的非終止數據(第一種情況是完全不確定的)。 – WhozCraig

+0

嘗試第一個'memset(root,0x00,sizeof(root));' – Ishmeet

回答

0

首先,不這樣做,root被初始化之前沒有:

printf("root[%d] = %s\n", i, root); 

root內容是未定義,通過打印它,你讓printf()打印任何垃圾值root保留,可能會越界,直到它找到一個空字節。

你的問題是,你不是零終止root。首先,修復循環。如果兩個詞都相同,它將訪問出界位置。所以,你的循環條件應該是:

while(first_word[i] == second_word[i] && first_word[i] != '\0') 

,然後把這個循環之後:

root[i] = '\0'; 
+0

因爲'scanf()'從用戶輸入,所以永遠不會是'NULL'字符的內容。另外,謝謝你的回答。我喜歡你的解釋。 –

+0

@Andy scanf總是終止帶有空字節的字符串。 –

1

你需要用空字符結束根:

while(first_word[i] == second_word[i]) 
    { 
     /* printf("root[%d] = %s\n", i, root); Can't print root here - it isn't null-terminataed yet */ 
     root[i] = first_word[i]; 
     i++; 
    } 
    root[i] = '\0'; 
+0

但是不會添加'root [i] ='\ 0';'當循環忽略所有打印內容時root? –

+0

@安迪號當你打印它時,你從'root'的開頭開始。 'printf(「%s」,root)'將打印'root'中的每個字符,直到找到空字節爲止。您只是將空字節放在最後一個位置。這就是爲什麼它在循環之後。 –

+0

@FilipeGonçalves哦,我明白了。感謝您的澄清。 –

2
  1. root包含垃圾值,則需要initalize它
    焦炭根[256 + 1] = {0} ;

  2. 而且while循環後, root[i]='\0';

現在,試試吧。

+0

,因爲你需要以null結束你的字符串。 'printf'打印字符串中的字符,直到找到一個''\ 0''又名'空字符'。 – brokenfoot

+0

明白了。非常感謝! –

2

C中的字符串由\0字符終止。 strlen返回第一個和終止符之間的字符數。由於動態創建字符串並且不附加終止符,因此strlen將在第一個和內存中任何遇到終止符的地方返回任意數量的字符(或者由於相同的原因,會出現分段錯誤) 。

爲了解決這個問題,你應該增加這種治療:

root[0] = '\0'; 
while(first_word[i] == second_word[i]) 
{ 
    printf("root[%d] = %s\n", i, root); 
    root[i] = first_word[i]; 
    root[i+1] = '\0'; 
    i++; 
} 
+0

當'first_word'和'second_word'相同時這會中斷。 –

相關問題