c - 为什么在尝试将字符串映射到其标记时会出现段错误?

标签 c

我需要将字符串映射到数组,以便“hacker”映射到[“h”,“ack”,“er”]。也就是说,我需要找到字符串中按升序排列的最大连续字符集。

我必须编写一个需要的函数

  • 字符串
  • 指向字符串数组的指针
  • 指向后者大小的指针

这样

f("hacker") = ([ "h", "ack", "er"], 3)

此函数的典型调用和使用是

char **tokens = NULL;
size_t tokens_length = 0;
tokenize("hacker", &tokens, &tokens_size)
printf("[ ");
for (int i = 0; i < tokens_length; i++) {
    printf("\"%s\", " tokens[i]);
}
printf("]");

这是我编写的函数的主体

void tokenize (const char *s, char ***tokens, size_t *tokens_length) {
    char *current_ptr = NULL;
    char *previous_ptr = NULL;
    size_t characters_read = 0;
    current_ptr = previous_ptr = s;
    for (; current_ptr < s + strlen(s);) {
        characters_read = characters_read + 1;
        if (*(current_ptr + 1) < *current_ptr) {
            *tokens_length = *tokens_length + 1;
            *tokens = (char**)realloc((void*)*tokens, *tokens_length * sizeof(char*));
            *tokens[*tokens_length - 1] = (char*)calloc(characters_read + 1, sizeof(char));
            strncpy(*tokens[*tokens_length - 1], previous_ptr, characters_read * sizeof(char));
            previous_ptr = current_ptr + 1;
            characters_read = 0;
        }
        current_ptr = current_ptr + 1;
    }
}

这是典型的输出...

[1]    4789 segmentation fault (core dumped)

你知道我为什么无法管理内存吗?

<小时/>

Here是我试图使其发挥作用的来源。

最佳答案

捕获!:)至少我没有遇到段错误。

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

size_t tokenize( const char *s, char ***tokens )
{
    size_t n = 0;
    const char *p;

    *tokens = NULL;

    p = s;
    while ( *p )
    {
        for ( const char *q = p; !( *++p < *q ); ++q );
        ++n;
    }

    if ( n != 0 )
    {
        size_t i = 0;

        *tokens = ( char ** )malloc( n * sizeof( char * ) );

        p = s;
        do
        {
            const char *q = p++;

            while ( !( *p < *( p - 1 ) ) ) ++p;

            ( *tokens )[i] = malloc( p - q + 1 );
            strncpy( ( *tokens )[i], q, p - q );
            ( *tokens )[i][p-q] = '\0';

            ++i;
        } while ( *p );
    }

    return n;
}

int main(void) 
{
    char s[] = "hacker";
    char **tokens;
    size_t n;

    n = tokenize( s, &tokens );

    printf( "[ " );
    for ( size_t i = 0; i < n; i++ )
    {
        printf( "\"%s\", ", tokens[i] );
    }
    printf( "]\n" );

    free( tokens );

    return 0;
}

程序输出如下

[ "h", "ack", "er", ]

关于c - 为什么在尝试将字符串映射到其标记时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26743067/

相关文章:

javascript - 为 asm.js 编写优化的 JS

c - 在 Linux 中跨共享库调用保留数据

c - printf() 在 scanf() 之后以行缓冲模式将不带换行符的字符串打印到标准输出

networking - 如何实现分两个进程接收和发送数据的TCP服务器?

c - AES mixColumns 错误

ios - xCode 项目未在 macOS Catalina 10.15.5 上找到 c++ 标准库

c - 用户输入到数组

c - 扩展 ASCII 字符在 int 10h 中不起作用

c - POSIX 共享 - 递归互斥体

c++ - 如何获取程序崩溃的行