问题描述
你能找出这段代码中的错误吗,即使我传递了有效的参数来查找,也无法打印歌曲
#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 askedSong[80];
printf("%s","hey buddy,what is the good one today? ");
fgets(askedSong,sizeof(askedSong),stdin);
find_track(askedSong);
return 0;
}
解决方法
- 假设你可以在 fgets 之后得到“\n”。需要修剪它(如果您从键盘输入)。您可以尝试使用文件输入运行: yourexefile.exe output.txt 并发现它以某种方式起作用
- 假设您在循环中找到结果后应该中断。
这里的问题是 fgets
在 '\n'
中包含尾随换行符 askedSong
。
这是我找到它的方式---
我在调试器中运行该程序并在 find_track()
中放置了一个断点。然后当提示我在命令行上输入“girl”时,看到函数的参数是“girl\n”。
这是我在调试器中看到的:
Hey buddy,what is the good one today? girl
Breakpoint 1,find_track (search_for=0x7fffffffd9c0 "girl\n") at test.c:15
15 for(i = 0; i < 5; i++) {
(gdb)
在 C 中有很多古怪的方法来修剪“\n”:Removing trailing newline character from fgets() input
,fgets extra \n 的问题(输入)
#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)!=NULL) {
printf("Track %i: '%s'\n",i,tracks[i]);
}
}
}
int main() {
char askedSong[80];
printf("%s","Hey buddy,what is the good one today? ");
scanf("%s",askedSong);// try to use scanf to ovoid \n in the buffer
find_track(askedSong);
return 0;
}
,
fgets
在字符串中留下换行符。轻松修复:
fgets(askedSong,sizeof(askedSong),stdin);
askedSong[strcspn(askedSong,"\n")] = 0;