簡體   English   中英

C語言strstr分段錯誤

[英]C-language strstr segmentation fault

我是初學者,track.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 tracks.c && ./a.out

輸入你的單詞:on

分段故障

但如果我使用puts(strstr(tracks [0],“on”)); 而不是puts(strstr(tracks [0],search_for)); 它會起作用葡萄酒,誰知道哪里出錯了?

這有幾個問題。

首先,未正確聲明常量數組。

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

這表示“聲明一個任意長度的char[5]數組char[5]非常仔細地觀察那個數組內容,並考慮這些字符串的長度實際上是它的字符數加上零終結符的一個 。你有什么東西突然出現嗎?也許這個詞是"three" ?那就是5 + 1,或者6個字符寬,而不是5個。

試試這個:

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]);
}

注意:為了我自己的理智,我從循環中刪除了多余的“Nothing found”。

最后,獲取的字符串可能會在結尾處添加行尾( '\\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;
}

這是因為fgets讀取換行符,因此在"one"找不到"on\\n" "one" ,因此strstr返回NULL,如果傳遞給puts ,則會導致分段錯誤。

您可能希望在讀取輸入后首先刪除換行符和其他空格,例如將新行/空格的第一次出現設置為0,如

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

(對於"three"char[5]也不夠,因為你需要額外的空終止符。)

你必須考慮兩件事:

如果單詞不在列表中,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也會讀取你輸入的換行符。 因此,如果您輸入四個並按Enter鍵,您將搜索“四個\\ n”因此您應該刪除那個\\ n字符,例如do

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

用fgets讀取輸入后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM