簡體   English   中英

使用strtok時出現分段錯誤

[英]Segmentation Fault when using strtok

在 main 中使用char *s時出現分段錯誤。 如果我使用char s[100]或類似的東西,一切都很好。 這是為什么? 當我使用指令char *token = strtok(s, delim);調用find_short(char *s)函數時,SIGSEGV 出現char *token = strtok(s, delim); . 這是我的代碼:

#include <sys/types.h>
#include <string.h>
#include <limits.h>
#include <stdio.h>

int find_short(char *s)
{
    int min = INT_MAX;
    const char delim[2] = " ";
    char *token = strtok(s, delim);
    while(token != NULL) {
        int len = (int)strlen(token);
        if (min > len)
            min = len;
        token = strtok(NULL, delim);
    }
    return min;
}
int main()
{
    char *s = "lel qwew dasdqew";
    printf("%d",find_short(s));
    return 0;
}

線路:

char *s = "lel qwew dasdqew";

在內存中創建一個指向常量字符串的指針。
由於該字符串是常量,因此您無法更改其內容。
strtok函數將嘗試通過在標記分隔符位置插入\\0來修改內容,但由於無法修改字符串而失敗。


將行更改為:

 char s[] = "lel qwew dasdqew";

現在使s成為您可以自由更改的本地數據數組。 strtok現在可以工作,因為它可以更改數組。

您的主要錯誤是您選擇了錯誤的功能來完成任務。:)

我將在下面說到這一點。

對於當前程序,C 中的字符串文字雖然沒有常量字符數組類型,但它們是不可變的。 任何更改字符串文字的嘗試都會導致未定義的行為。 並且函數strtok更改傳遞給它的字符串,在子字符串之間插入終止零。

您應該使用字符串函數strspnstrcspn而不是函數strtok 它們不會更改傳遞的參數。 因此,使用這些函數,您還可以處理字符串文字。

這是一個演示程序。

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

size_t find_short( const char *s )
{
    const char *delim= " \t";

    size_t shortest = 0;

    while ( *s )
    {
        s += strspn( s, delim );

        const char *p = s;

        s += strcspn( s, delim );

        size_t n = s - p;

        if ( shortest  == 0 || ( n && n  < shortest ) ) shortest = n;
    }

    return shortest;
}

int main(void) 
{
    const char *s = "lel qwew dasdqew";

    printf( "%zu", find_short( s ) );

    return 0;
}

它的輸出是

3

暫無
暫無

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

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