我試圖找到兩個單詞之間的前綴,但似乎我所擁有的是不正確的。首先if(strlen(root) == 0)
總是評估爲0.爲什麼?
Char陣列不是空的時候應該是
The longest common prefix of astrophysics and math is 0��. // <<--- why does this get printed? //
我試圖找到兩個單詞之間的前綴,但似乎我所擁有的是不正確的。首先if(strlen(root) == 0)
總是評估爲0.爲什麼?
Char陣列不是空的時候應該是
The longest common prefix of astrophysics and math is 0��. // <<--- why does this get printed? //
首先,不這樣做,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';
因爲'scanf()'從用戶輸入,所以永遠不會是'NULL'字符的內容。另外,謝謝你的回答。我喜歡你的解釋。 –
@Andy scanf總是終止帶有空字節的字符串。 –
你需要用空字符結束根:
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';
但是不會添加'root [i] ='\ 0';'當循環忽略所有打印內容時root? –
@安迪號當你打印它時,你從'root'的開頭開始。 'printf(「%s」,root)'將打印'root'中的每個字符,直到找到空字節爲止。您只是將空字節放在最後一個位置。這就是爲什麼它在循環之後。 –
@FilipeGonçalves哦,我明白了。感謝您的澄清。 –
你root
包含垃圾值,則需要initalize它
焦炭根[256 + 1] = {0} ;
而且while循環後, root[i]='\0';
現在,試試吧。
,因爲你需要以null結束你的字符串。 'printf'打印字符串中的字符,直到找到一個''\ 0''又名'空字符'。 – brokenfoot
明白了。非常感謝! –
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++;
}
當'first_word'和'second_word'相同時這會中斷。 –
'root'永遠不會初始化任何在此代碼,如果這兩個詞都沒有領先的相似字符,即使他們有*類似的字符也不會被終止。 while-loop'printf'也會調用未定義的行爲,因爲您發送的數據是字符串格式說明符的非終止數據(第一種情況是完全不確定的)。 – WhozCraig
嘗試第一個'memset(root,0x00,sizeof(root));' – Ishmeet