首字母C程序(文本搜索程序)
我有一个关于以下项目的问题,来自Head First C。 在主功能下的书中,作者没有使用首字母C程序(文本搜索程序),c,C,我有一个关于以下项目的问题,来自Head First C。 在主功能下的书中,作者没有使用search_[strlen(search_for)-1]='\0';但他的程序运行良好。然而,当我使用原始版本的程序(根据书),它无法找到我输入的文本。我从github获得了以下版本(它可以找到字符串中的文本),但我仍然不明白为什么要使用它。如果有人能给我解释,我将非常感激 #include <stdio.h> #include <string.h> char tracks[][
search_[strlen(search_for)-1]='\0'代码>;但他的程序运行良好。然而,当我使用原始版本的程序(根据书),它无法找到我输入的文本。我从github获得了以下版本(它可以找到字符串中的文本),但我仍然不明白为什么要使用它。如果有人能给我解释,我将非常感激
#include <stdio.h>
#include <string.h>
char tracks[][80] = {
"I left my heart in Harvad Med School",
"Newark, Newark - 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);
search_for[strlen(search_for) - 1] = '\0';
find_track(search_for);
return 0;
}
#包括
#包括
字符轨道[][80]={
“我把我的心留在哈瓦德医学院”,
“纽瓦克,纽瓦克-美妙的小镇”,
“和傻瓜跳舞”,
“从这里到产妇”,
“硫磺岛的女孩”,
};
void find_track(char search_for[])
{
int i;
对于(i=0;i<5;i++){
if(strstr(轨道[i],搜索)
printf(“磁道%i:'%s'\n',i,磁道[i]);
}
}
int main()
{
[80]的字符搜索;
printf(“搜索:”);
fgets(搜索,80,标准输入法);
搜索[strlen(搜索)-1]='\0';
查找跟踪(搜索);
返回0;
}
根据CPluPlus网站,这一行:
fgets(search_for, 80, stdin);
正在捕获换行符
字符,在搜索结束时
如果键入:
heart<intro>
将从字符串中删除换行符(heart\n
到heart
),因为如果不删除换行符,搜索将失败
从流中读取字符并将其作为C字符串存储到str中
直到读取了(num-1)个字符或换行符或
到达文件末尾,以先发生的为准
换行符使FGET停止读取,但它被视为
函数指定的有效字符,并包含在复制到的字符串中
str
“\0”是字符串的显式空终止符。以null结尾的字符串是存储为包含字符的数组的字符串,以null字符('\0',在ASCII中称为NUL)结尾。根据标准是,它是以null字符结尾的复制到str的字符后会自动追加一个终止的空字符。谢谢您的回答。只是确认一下,如果我把“heart”放在这里,由于fgets的缘故,它读起来像“heart\n\0”。我们确实通过搜索[strlen(search-for)-1]='\0'删除了它;如果你能解释一下语法,我将不胜感激。我理解的是逻辑而不是语法你理解对了,fgets给你心\n\0
,你删除换行符\n
,它代表键盘上的
或
键。是的,因为你不只放心,你就放心。如果不按intro键,fgets不会读取任何内容。为了便于阅读和理解:1)始终缩进代码。在每个左大括号“{”之后缩进。在每个右大括号“}”之前取消缩进。建议每个缩进级别为4个空格。张贴的代码包含几个“神奇”数字神奇的数字是没有基础的数字。即5,80'“魔法”数字使代码更难理解、调试等。建议使用enum
语句或#define
语句为这些“魔法”数字指定有意义的名称,然后在整个代码中使用这些有意义的名称。关于:for(i=0;i<5;i++)
magic数字5是表中的行数tracks[][80]
1)最好将表声明为指向字符字符串的指针数组char*table[]=…
则5
将被定义为:sizeof(table)/sizeof(table[0])
代码应始终检查(!=NULL)来自fgets()
的返回值,以确保操作成功。
search_for[strlen(search_for) - 1] = '\0';
search_for[strlen(search_for) - 1] = '\0';