2013-08-03 131 views
0

似乎無法看到我的錯誤,當我編譯並運行時,我只是得到「Search for:」出現,我輸入了一些應該顯示結果但什麼也沒有發生,只是退出的東西。列舉數組時遇到問題

我已經從Head First C書中完全重新創建了這段代碼(但是它的工作原理並不一樣),它們在搜索時會顯示結果。

所以打我的傢伙,我做錯了什麼?提前致謝!!

順便說一句,數組+數組指針我的頭在哈哈。

下面的代碼:

#include <stdio.h> 
#include <string.h> 

char tracks[][80] = 
{ 
    "I left my heart in Harvard Med School", 
    "Newark, Newark - A wonderful town", 
    "Dancing with a Dork", 
    "From here to maternity", 
    "The girl from Iwo Jima", 
}; 

void find_track(char search_for[]) 
{ 
    int i; 
    for (i = 0; i < 5; i++) 
    { 
     if (strstr(tracks[i], search_for)) 
      printf("Track %i: '%s'\n", i, tracks[i]); 
} 
} 

int main() 
{ 
    char search_for[80]; 
    printf("Search for: "); 
    fgets(search_for, 80, stdin); 
    find_track(search_for); 
    return 0; 
} 
+1

你打「硫磺島女孩」嗎? –

回答

4

fgets功能,如所陳述here,包括新的線(\n)字符,因爲它被認爲是一個有效的字符:

甲換行符使得fgets停止讀取,但它被函數認爲是有效的字符,並且包含在複製到str的字符串中。

這意味着你要檢查,例如:

"I left my heart in Harvard Med School" 

"I left\n" 

,所以比賽不會發生。你可以嘗試使用gets或更換\n字符用NUL(\0):

char search_for[80]; 
fgets(search_for, 80, stdin); 
search_for[strlen(search_for)-1] = '\0'; 
1

fgets手冊頁:「一個EOF或換行後讀停止。如果一個換行符被讀取,它被存儲到在緩衝區中的最後一個字符之後存儲一個終止空字節('\ 0')。「

因此,在您的代碼中,按下最終的「Enter」後,存儲在search_for中的值實際上是「what_you_type」+「\n」。但tracks不包含任何「\n」,因此沒有發現您輸入的內容並不意外。

更改tracks到:

char tracks[][80] = 
{ 
    "I left my heart in Harvard Med School\n", 
    "Newark, Newark - A wonderful town\n", 
    "Dancing with a Dork\n", 
    "From here to maternity\n", 
    "The girl from Iwo Jima\n", 
}; 

,並輸入整個句子或像「Iwo Jima」的東西,你一定會發現你在找什麼。

+0

感謝你們......但有趣的是,他們在書中沒有\ n,他們的代碼看起來很有效,他們只搜索一個詞,不必搜索整個句子或任何東西。 這是他們的代碼。 ![電子書頁面的屏幕截圖] [1] [1]:http://i.stack.imgur.com/X25RC.png – spergy

+0

也許這本書不夠嚴肅。如果在曲目中添加「\ n」,只需輸入每個句子的最後一個單詞即可,例如「Jima」,「Iwo Jima」,「硫磺島」等。 –

+0

不夠嚴重?到目前爲止,我讀過的每本書都有些問題,你有什麼建議? – spergy

1

Jack的回答是OK。

可以更換

與fgets(搜索內容,80,標準輸入);

通過

的scanf( 「%輛79」,搜索字符串);

這是本書的一個錯誤。您可以在Errata for Head First C查看其他人。