字符串匹配的C代码似乎不起作用

#include  #include  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); getch(); return 0; } 

这是直接从Head First C获取的代码。这不起作用。另一方面,如果我更改main中的行

 char search_for[80]; 

 char *search_for = "town" 

它给了我预期的结果。 我不明白为什么它不起作用。我明白直接粘贴代码并告诉你发现错误在这里不是很容易接受,但我想这是一个非常小的基本代码,所以它会做。

谢谢

上面代码的问题在于它没有考虑fgets在字符串中留下换行符的事实。 因此,当您键入town并按enter ,您最终将搜索"town\n"

解决这个问题的一种便宜的方法是在调用fgets之后修复字符串

 search_for[strlen(search_for) - 1] = 0; 

正如@cnicutar已经指出的那样,fgets在字符串中留下换行符char(代码10)。 您可以通过迭代char数组并打印字符代码并在ASCII代码表(http://www.asciitable.com/)中查找特殊字符来自行查找:

 int main() { int i; char search_for[80]; printf("Search for: "); fgets(search_for, 80, stdin); scanf("%79s", search_for); // print index, char code, char itself for (i=0;i<80;i++) { printf("%d: %d %c\n", i, search_for[i], search_for[i]); } find_track(search_for); getch(); return 0; } 

输出将是:

 ... 0: 116 t 1: 111 o 2: 119 w 3: 110 n 4: 10 5: 0 ... 

您可以使用函数“scanf”并将读取字符数限制为79(字符串末尾的NULL char为1个char保留,因为缓冲区最多可容纳80个字符)。 请参阅: http : //www.cplusplus.com/reference/clibrary/cstdio/scanf/以供参考。

 int main() { char search_for[80]; printf("Search for: "); scanf("%79s", search_for); find_track(search_for); return 0; }