2011-10-30 66 views
5

爲什麼這個特定的代碼段在strstr()上返回false是否輸入「test」?strstr不起作用

char input[100]; 

int main() 
{ 
    fgets(input, 100, stdin); 
    printf("%s", input); 

    if(strstr("test message", input)) 
    { 
     printf("strstr true"); 

    } 


} 

我以爲strstr搜索了第二個參數的第一個參數?它可以在我用一些文本替換輸入或直接賦值時起作用,但它似乎不適用於fgets。

+0

至於處理這個問題,有http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input –

回答

10

這是因爲fgets存儲換行符,所以當strstr做比較失敗時。

從手冊頁:

與fgets()最多有一個小於大小的字符從流 並將它們存儲在讀入緩衝區由s指向。讀取後 EOF或換行符停止。如果讀取換行符,則將其存儲在緩衝區中 。 '\ 0'存儲在緩衝區中的最後一個字符之後。

+0

刪除可能,你得到+1 :) – FailedDev

+0

@sashang該文件部分仍然令人困惑。它說EOF或換行符。這是什麼?我正在閱讀一個教程,它讓我失望。將最後一個字符替換爲空'\ 0'完成了這個訣竅,但是該教程使得它看起來像'fgets'自動放置了'\ 0',而實際上它放置了'\ n'。由於這個'strstr'沒有運作。但那爲什麼這本書說它會起作用呢? – Andy

+0

@Andy:'EOF或換行符'表示EOF或換行符或兩者。 'or'這裏的意思是邏輯布爾值,而不是'or',用於口語英語。因此他們都是有效的答案。 – sashang

6

添加input[strlen(input) - 1] = '\0';fgetsfgets讀入換行符char('\n')。 "test message"中沒有'\n',所以input將永遠不會包含在其中。

在調用fgets來確定整行是否能夠真正適合它並顯式刪除它之後,您應該確實檢查新行是否在緩衝區末尾。

+0

我假設當'fgets'讀取,比如''Hello「'時,它實際上讀取的是」Hello \ n \ 0「或'\ n \ n \ n」'。 – Andy

+0

它讀取'「Hello \ n」',然後用''\ 0''終止字符串。但是,只有在需要閱讀換行符的情況下。 – AusCBloke

+0

讓我來重述一下這個問題。 「fget」的總結果是什麼?我問,因爲'strstr'不工作。當我做'變量[strlen(變量)-1] ='\ 0''時,它可以工作。當'strlen'解析字符串的長度時,它會跳過終止空值嗎?所以''你好\ n \ 0「',它是6,因爲它包含換行符?如果是這樣,那麼結果將會是'「Hello \ 0 \ 0」'如果那我怎麼解決我的問題這有點浪費。順便謝謝你的時間。 – Andy