繁体   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