Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
首字母C程序(文本搜索程序)_C - Fatal编程技术网

首字母C程序(文本搜索程序)

首字母C程序(文本搜索程序),c,C,我有一个关于以下项目的问题,来自Head First C。 在主功能下的书中,作者没有使用search_[strlen(search_for)-1]='\0';但他的程序运行良好。然而,当我使用原始版本的程序(根据书),它无法找到我输入的文本。我从github获得了以下版本(它可以找到字符串中的文本),但我仍然不明白为什么要使用它。如果有人能给我解释,我将非常感激 #include <stdio.h> #include <string.h> char tracks[][

我有一个关于以下项目的问题,来自Head First C。 在主功能下的书中,作者没有使用
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';