如果我用scanf运行以下代码,如果它在tracks数组中,它将返回一个字符串。根据《 Head First C》一书,这应该与fgets一起使用,但对我没有任何回报:
#include <stdio.h>
#include <string.h>
#define MAX 80
char tracks[][MAX] = {
"The Girl from Ipanema",
"Here Comes the Sun",
"Wonderwall",
"You Belong To Me",
"Everlong",
};
void find_track(char search_for[])
{
int i = 0;
for(i = 0; i < 5; i++) {
if(strstr(tracks[i], search_for)) {
printf("Track %d: %s\n", i, tracks[i]);
}
}
}
int main()
{
char search_for[MAX];
printf("Search for: ");
//scanf("%79s", search_for);
fgets(search_for, MAX, stdin);
find_track(search_for);
return 0;
}
输入内容如下:
./tracks
Search for:
Here
什么都没发生
答案 0 :(得分:1)
可能是因为fgets
还将读取换行符,即'\n'
。详细信息:
如果键入Girl<enter>
,则search_for
将包含以下字符:'G' 'i' 'r' 'l'
'\n'
但是,您的tracks
仅包含'G' 'i' 'r' 'l'
,而没有'\n'
。
因此,您将找不到匹配的子字符串。
尝试更改:
fgets(search_for, MAX, stdin);
进入
fgets(search_for, MAX, stdin);
if (strlen(search_for) > 0) search_for[strlen(search_for)-1] = '\0';
删除尾随换行符
基于评论进行编辑
的确(根据您的操作系统/环境),输入流可以终止而无需换行(某些系统上为ctrl-z,ctrl-d)。如果这样做,上面的代码是不够的。它需要额外的检查,例如:
if (strlen(search_for) > 0 && search_for[strlen(search_for)-1] == '\n')
search_for[strlen(search_for)-1] = '\0';
确保仅将“换行符”转换为字符串终止。
答案 1 :(得分:-1)
您还可以使用函数memcpy摆脱换行符。
C库函数void * memcpy(void * str1,const void * str2,size_t n)将n个字符从存储区str2复制到存储区str1。
fgets(s, MAX, stdin);
memcpy(search_for, s, strlen(s)-1);
find_track(search_for);
您也可以添加一些错误处理。