3

我是初学者,tracks.c:

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

char tracks[][5] = {
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
};

void track_search(char search_for[]) {

    int i;
    puts(search_for);
    puts(strstr(tracks[0], search_for));

    /*
    for (i = 0; i < 6; i++) {
        if (strstr(tracks[i], search_for)) {
            printf("tracks %i: %s\n", i,tracks[i]);
        } else {
            puts("Nothing found");
        }
    }
    */
}

int main() {

    char search_for[5];

    printf("enter your word: ");
    fgets(search_for, 5, stdin);
    track_search(search_for);

    return 0;
}

$ gcc track.c && ./a.out

输入你的话:开

分段故障

但是如果我使用 puts(strstr(tracks[0], "on")); 而不是 puts(strstr(tracks[0], search_for)); 可以用酒,有人知道哪里错了吗?

4

3 回答 3

3

这有几个问题。

首先,您的常量数组未正确声明。

char tracks[][5] = {
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
};

这表示“声明一个任意长度的数组。密切char[5]关注该数组内容,并考虑这些字符串的长度实际上是它的字符数加上零终止符的1。有什么突然出现在你身上吗?也许是这个词?那将是 5+1,或六个字符宽,而不是五个。"three"

尝试这个:

const char *tracks[] = 
{
    "one",
    "two",
    "three",
    "four",
    "five",
    "six"
};

并像这样修改你的 for 循环:

for (i = 0; i < sizeof(tracks)/sizeof(tracks[0]); ++i) 
{
    if (strstr(tracks[i], search_for))
        printf("track[%d]: %s\n", i, tracks[i]);
}

注意:为了我自己的理智,我从循环中提取了多余的“未找到”。

最后,获取的字符串可能会在末尾'\n'附加一个行尾 ( ),如果是这样,您应该检查并将其设为空。我会显着延长输入缓冲区的大小,然后修剪 endl(如果存在):

int main()
{
    char search_for[64] = {0};

    printf("enter your word: ");
    if (fgets(search_for, sizeof(search_for), stdin))
    {
        size_t len = strlen(search_for);
        if (len && search_for[len-1] == '\n')
            search_for[len-1] = 0;
        track_search(search_for);
    }
    else
    {
        perror("fgets failed.");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}
于 2013-01-27T01:52:44.873 回答
3

这是因为fgets读取了换行符,所以"on\n"在 中找不到"one",因此strstr返回 NULL,如果传递给 ,则会导致分段错误puts

您可能希望在读取输入后首先删除换行符和其他空格,例如将第一次出现的换行符/空格设置为 0,例如

char *p;
if(p = strchr(search_for, '\n')) *p = 0;
if(p = strchr(search_for, ' ')) *p = 0;

(对于 也是char[5]不够的"three",因为您需要空终止符的额外位置。)

于 2013-01-27T01:45:36.327 回答
2

有两件事你必须考虑:

如果单词不在列表中,strstr() 返回一个 NULL 指针,你不能将它传递给 puts(),例如

 char *found = strstr(tracks[0], search_for);
if (found)
    puts(found);
else
    puts("The word '%s' was not found\n",search_for);

一旦你这样做了,你就会意识到 fgets 也会读取你输入的换行符。因此,如果您输入四个并按回车键,您将搜索“four\n”所以您应该删除那个 \n 字符,例如执行

char *p;
if ((p = strrchr(search_for, '\n')) != NULL) {
   *p = 0;
}

使用 fgets 读取输入后。

于 2013-01-27T01:49:04.827 回答