strstr函数与c语言中的多维数组

strstr函数与c语言中的多维数组,c,initialization,fgets,c-strings,strstr,C,Initialization,Fgets,C Strings,Strstr,输出 最有可能是通过fgets()输入的问题 您正在读取指向\u search\u str的未初始化指针,该指针未指向有效的内存位置。在这种情况下,您只需将其更改为数组,如char to_search_str[80]={0}并完成它 您需要修剪存储在输入缓冲区中的尾随换行符 从(矿山) fgets()从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行后,读取停止如果读取换行符,则将其存储到缓冲区。在缓冲区中最后一个字符后存储终止的空字节('\0') 一个快速的

输出

最有可能是通过
fgets()输入的问题

  • 您正在读取指向\u search\u str的未初始化指针
    ,该指针未指向有效的内存位置。在这种情况下,您只需将其更改为数组,如
    char to_search_str[80]={0}并完成它

  • 您需要修剪存储在输入缓冲区中的尾随换行符

    从(矿山)

fgets()
从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。
EOF
或换行后,读取停止如果读取换行符,则将其存储到缓冲区。在缓冲区中最后一个字符后存储终止的空字节(
'\0'


一个快速的方法是
to_search_str[strcspn(to_search_str,“\n”)]=0
,但在

char*to_search_str中提到了更为健壮的方法
是未初始化的指针,向其写入将导致未定义的行为。您必须分配内存或使用数组来代替char to_search_str[100]例如


另外,不要忘记,
fgets
还会将换行符读入缓冲区,您必须将其删除。

您没有将
分配给搜索\u str
指针,即传递给
fgets
指针作为目标缓冲区。由于它实际上未初始化,这会导致未定义的行为,通常以程序崩溃结束

您只需要静态或动态地分配它

最简单的解决方案就是在堆栈中定义一个静态数组:

#include <stdio.h>
#include <string.h>

void find_track(char *search_for);
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"
};

int main() {
    char to_search_str[80];
    printf("Search for: ");
    fgets(to_search_str, 80, stdin);
    to_search_str[strlen(to_search_str)-1] = '\0';
    find_track(to_search_str);
    return 0;
}

void find_track(char *search_for) {
    int i;
    for (i=0; i<5; i++) {
        if (strstr(tracks[i], search_for)) {
            printf("Track %d: '%s'\n", i, tracks[i]);
        }
    }
}

注意:由于
fgets
在输出缓冲区中保留尾随换行符“`\n`',我们必须将其删除。我使用了所描述的聪明的oneliner解决方案。

这段代码在main中

#include <string.h>

#define LEN 80

int main() {
    char * to_search_str = malloc(LEN);

    printf("Search for: ");
    fgets(to_search_str, LEN, stdin);

    /* Remove trailing newline from the string to search */
    to_search_str[strcspn(to_search_str, "\n")] = 0;

    find_track(to_search_str);

    free(to_search_str);
    return 0;
}
调用未定义的行为,因为指向\u search\u str
的指针未初始化且具有不确定的值

看来你至少是认真的

char *to_search_str;
printf("Search for: ");
fgets(to_search_str, 80, stdin);
函数
fgets
可以将新行字符
'\n'
附加到输入的字符串中

例如,您需要通过以下方式删除它

char to_search_str[80];
printf("Search for: ");
fgets(to_search_str, 80, stdin);
函数
find_track
应至少声明为

to_search_str[ strcspn( to_search_str, "\n" ) ] = '\0';
尽管当函数定义依赖于全局变量时,这是一个坏主意


此外,查找相关字符串的方法也不好。例如,用户可以输入仅包含一个字符的字符串
'a'
。在这种情况下,所有记录都将满足条件。您应该检查搜索的字符串是否在数组中的字符串中形成一个单词(由空格分隔的字符序列)。

示例输入文件是什么样子的?请编辑您的问题并张贴代表金额。在修复了其他人在下面提到的bug之后,您可能需要将args的顺序颠倒为
strstr
。例如,如果输入行是:
我最喜欢的歌曲是:“与傻瓜跳舞”,但我也喜欢:“硫磺岛的女孩”还有。
我刚开始学习C。我假设输入的只是一个单词,比如
舞蹈
或'Harvard'@CraigEstey,我不需要颠倒args的顺序,它很好,很好。有两种类型的搜索:(1)在[long]输入句子中,查找与歌曲歌词行之一的匹配项。(2) 在一个有单词列表的文件中,每行一个单词,查看给定歌词中的单词。您的问题不清楚哪一个是期望的结果[因为没有提供示例输入]。您编辑的代码[仍然]不正确。您正在使用
to_search_str[strlen(to_search_str)-2]='\0'剪裁过多的字符--它应该仅为
-1
。如您所知,输入行为
Harvard
-->
Harvar
。另外,像
这样的行非常出色
-->
非常出色
,即使不应该匹配,也会匹配。此外,即使使用
-1
修复,一些输入文件也会保留最后一行换行符,因此代码会切掉最后一行。摆脱换行符的可靠方法:
*strchnul(to_search_str,'\n')=0[这与Vlad建议的strcspn类似,但速度更快]我不是你的DVer,而是两件事。(1) 我会这样做(例如):
#定义len80
,然后
char*to_search\u str=malloc(LEN);fgets(至搜索街、LEN街、stdin街)或者,只是:
char to_search_str[80];fgets(至搜索街、sizeof(至搜索街)、stdin)(2)但是,真正的问题可能是代码需要切掉换行符。在我看来,没有解释的DVG不是一条路。通常,允许响应者修复的注释就足够了。只有当回复者并没有纠正一个错误的答案时,才应该使用DV。@CraigEstey谢谢你们的评论。我肯定可以添加
#define LEN 80
;我会在我的实际代码中使用它,但我没有在我的答案中包含它。我不确定尾随换行符的问题,因为:1)问题中没有提到这个要求(人们可能真的想保留它)-2)OP的测试语句不包含换行符。@CraigEstey我还添加了一个关于删除尾随换行符的注释。需要换行符条带。如果您运行的[例如您的]版本没有换行符,则搜索提示字符串
Harvard\n
将失败。使用strip,要搜索的
字符串将是
Harvard
,这将成功。@RobertoCaboni感谢您从现在起的澄清,我确保永远不会使用该方法删除换行符
char to_search_str[80];
printf("Search for: ");
fgets(to_search_str, 80, stdin);
to_search_str[ strcspn( to_search_str, "\n" ) ] = '\0';
void find_track( const char *search_for);