gpt4 book ai didi

c - 《Head First C》一书中关于strstr()和fgets()的问题

转载 作者:行者123 更新时间:2023-12-04 10:47:25 26 4
gpt4 key购买 nike

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++) {
char *pointer = strstr(tracks[i], search_for);
printf("P:%s\n", pointer);
}
}

int main() {

char search_for[80];
printf("Search for: ");
fgets(search_for, 80, stdin);
// scanf("%79s", search_for);
find_track(search_for);


return 0;
}

这是使用 strstr() 和 fgets() 的示例。
但是当我运行它时,它无法返回匹配的指针,它始终为空。
Search for: wonderful
P:(null)
P:(null)
P:(null)
P:(null)
P:(null)

我尝试了一些不同的表达方式:
1.我将 search_for 数组的容量从 80 减少到 10:
char search_for[10];

有用!
Search for: wonderful
P:(null)
P:wonderful town
P:(null)
P:(null)
P:(null)

2.我将函数 fgets() 替换为 scanf()。
scanf("%79s", search_for);

它也有效!
Search for: wonderful
P:(null)
P:wonderful town
P:(null)
P:(null)
P:(null)

因此,我对此感到困惑,谁能告诉我这种现象的深层原因?

最佳答案

这是因为 fgets最多读取长度为 80-1 = 79 个字符(它留下 1 个字符成为空终止)但在换行后停止读取 \n附加到 stdin 的字符输入“wonderful”并按回车键后。它复制了这个 \n字符到你的缓冲区,所以输入字符串实际上是 "wonderful\n\0" ,这与您拥有的数据不匹配,因为换行。

现在,当您碰巧声明缓冲区大小为 10 时,fgets没有空间存放 \n ,但仍然 null 终止字符串 - 这就是它意外工作的原因。
scanf另一方面离开\n落后于 stdin没有阅读它,这就是为什么scanf也有效。然而,fgets是更好更安全的功能,所以你应该继续使用它。

快速解决方法是执行以下操作:

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

这会覆盖 \n带有空终止符。在 fgets 之后你有 "wonderful\n\0"在内存中,然后 search_for[strlen(search_for)-1] = '\0';将此更改为 "wonderful\0\0" .

请注意,对于正确的程序,您还应该添加错误处理:
if(fgets(search_for, 80, stdin) != NULL)
{
search_for[strlen(search_for)-1] = '\0';
find_track(search_for);
}

关于c - 《Head First C》一书中关于strstr()和fgets()的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59639162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com