разрезание строки, когда персонаж найден - PullRequest
0 голосов
/ 07 января 2019

Я написал функцию, которая обрезает строку "hello world" в "hell", если найдено 'o'.

Я продолжаю получать ошибку сегментации. Я не знаю, где может быть ошибка. Может ли кто-нибудь помочь? Заранее спасибо.

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

char* cutString(char* str, char del){

    char *newstring =(char*) str;
    malloc(sizeof(char)*strlen(str));
    int i= 0;

    for(; newstring[i]!='\0'&&newstring[i]!=del;i++);

    if(i==strlen(newstring))
     printf("not found");
     else
     newstring[i]='\0';

    return newstring;
}


int main(){



    cutString("Hello World",'o');

    return 0;

}

Ответы [ 3 ]

0 голосов
/ 07 января 2019
 newstring[i]='\0';

Эта строка недействительна. Модификация строковых литералов - неопределенное поведение. Я хотел бы предложить проверить это: ошибка сегментации при использовании указателя

Лучшим решением было бы использовать массивы вместо указателей

0 голосов
/ 07 января 2019

В вашем коде есть ряд проблем. Основная проблема заключается в том, что вы не назначаете возвращаемое значение от malloc до newstring. Кроме того, вам нужно malloc дополнительный байт для завершения строки.

Кроме того, ваш цикл должен копировать символы из str в newstring.

В main необходимо присвоить возвращаемое значение из функции переменной указателя символа, чтобы получить новую строку.

Что-то вроде:

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

char* cutString(char* str, char del){

    char *newstring = malloc(strlen(str) + 1);  // malloc into newstring
    int i= 0;

    while (newstring[i]!='\0' && str[i] != del)  // Stop when a) no more chars in str or b) "del" is found
    {
        newstring[i] = str[i];     // Copy character from str to newstring
        ++i;
    }

    newstring[i]='\0';  // Terminate the string

    return newstring;
}


int main(){
    char* newstring = cutString("Hello World",'o');  // Save the returned value
    printf("%s\", newstring);
    free(newstring);
    return 0;
}
0 голосов
/ 07 января 2019

Есть две основные проблемы с вашим кодом:

  1. char *newstring =(char*) str указывает newstring на старое str. А поскольку вы передаете буквальную строку (которая только для чтения ), вы будете иметь неопределенное поведение , пытаясь изменить ее.

  2. malloc(sizeof(char)*strlen(str)); - утечка памяти. И не выделяет место для терминатора.

Сбой, вероятно, из-за первого пункта, когда вы пытаетесь изменить строковый литерал только для чтения.

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