Обрезка строки при нахождении символа

Я написал функцию, которая преобразует строку «hello world» в «ад», если найдена буква «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;

}
malloc(sizeof(char)*strlen(str));? Вам нужно узнать, что такое возвращаемые значения и что они означают. Вы создаете блок памяти с этой строкой кода и выбрасываете его, потому что вы не сохраняете возвращаемое значение.
Andrew Henle 07.01.2019 14:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

так и должно быть вот так char *newstring= malloc(sizeof(char)*strlen(str));

momonosuke 07.01.2019 14:37

@momonosuke Это, вероятно, хорошее начало, но также потребуется дополнительная работа, поскольку тогда в памяти не будет исходной строки. И, как уже упоминалось, не хватает места для терминатора, если вся исходная строка копируется.

Some programmer dude 07.01.2019 14:39
 newstring[i]='\0';

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

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

проблема в том, что мне нужно выделить новую память для строки. Это мое задание. Прочитал статью и понимаю, почему мой подход неверен.

momonosuke 07.01.2019 14:51
Ответ принят как подходящий

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

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

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

Что-то типа:

#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;
}

Другие вопросы по теме