Сторнирование строки с использованием рекурсии - получение ошибки «Поток 1: EXC_BAD_ACCESS (code = 1, address = 0x0)» - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь отменить строку с помощью следующего кода, но получаю ошибку Thread 1: EXC_BAD_ACCESS (code=1, address=0x0).

Я понимаю, что это говорит мне о том, что я пытаюсь получить доступ к пустому указателю, но не вижу, где:

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

int empty(char s[]){
    return strcmp(s, "") == 0 ? 1 : 0;
}

char getHead(char s[]){
    char *dup = (char *)malloc(sizeof(char));
    strcpy(dup, (s + 0));
    return *dup;
}

char * getTail(char s[]){
    char *dup = malloc(sizeof(char) * strlen(s) - 1);
    for(int i = 0; i < strlen(s) - 1; i++){
        dup[i] = s[i+1];
    }
    return dup;
} 

char * ReverseStringHeadTail(char s[]){
    if(empty(s))
    {
        return NULL;
    }
    else
    {
        char head = getHead(s);
        char *tail = getTail(s);
        return strcat(ReverseStringHeadTail(tail), head); // Error: Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
    }
}

int main(int argc, const char * argv[]) {
    char string[] = "string";
    printf("%s\n", ReverseStringHeadTail(string));

    return 0;
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 июля 2019
char *revm(char *buff, const char *str, const size_t len)
{
    if(!len) len = strlen(str);
    if(!buff)
    {
        buff = calloc(len + 1, 1);
    }
    if(buff && len)
    {
        *buff = *(str + len - 1);
        *(buff + len - 1) = *str;
        if(len > 2) rev(buff + 1, str + 1, len - 2);
    }
    return buff;
}

int main(void)
{

    char *str = "1234567890";

    char *str1 = rev(NULL, str, 0);
    printf("%s\n", str1);
    return EXIT_SUCCESS;
}

или если вы не хотите отменить заданную строку (она должна быть доступна для записи)

char *rev(char *str, size_t len)
{
    if(!len) len = strlen(str);

    if(len)
    {
        int tmp = *str;
        *str = *(str + len - 1);
        *(str + len - 1) = tmp;
        if(len > 2) rev(str + 1, len - 2);
    }
    return str;
}


int main(void)
{

    char str[] = "123456789";

    char *str1 = rev(str, 0);
    printf("%s\n", str1);
    return EXIT_SUCCESS;
}
0 голосов
/ 08 июля 2019

Функция empty может быть написана проще.

int empty( const char *s )
{
    return *s == '\0';
}

Функция getHead недействительна и не имеет смысла.Он выделяет память для одного символа, но пытается скопировать всю строку.И его вызов приводит к утечке памяти.

Вы можете просто написать

char getHead( const char *s )
{
    return *s;
}

Функция getTail также недопустима.Например, если строка, например, "A", функция выделяет память 0 байтов.В любом случае выделенная память не будет содержать строку.

Функция strcat не может использоваться с объектом типа char или с нулевым указателем.

Кажется, чтоВы имеете в виду следующее.

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

char * ReverseStringHeadTail( const  char *s )
{
    if ( *s == '\0' ) return calloc( 1, 1 );

    char tmp[2] = { *s, '\0' };

    char *p = ReverseStringHeadTail( s + 1 );
    p = realloc( p, strlen( p ) + sizeof( tmp ) );

    return strcat( p, tmp );
}

int main(void) 
{
    const char *s = "12345";

    puts( s );

    char *p = ReverseStringHeadTail( s );

    puts( p );

    free( p );

    return 0;
}

Вывод программы следующий:

12345
54321

Обратите внимание, что функция не проверяет, была ли память выделена успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...