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





В вашем коде есть две основные проблемы:
char *newstring =(char*) str указывает newstring на старый str. И поскольку вы передаете буквальную строку (которая является только чтение), неопределенное поведение пытается ее изменить.
malloc(sizeof(char)*strlen(str)); - это утечка памяти. И не выделяет место для терминатора.
Сбой, вероятно, вызван первой точкой, когда вы пытаетесь изменить строковый литерал, доступный только для чтения.
так и должно быть вот так char *newstring= malloc(sizeof(char)*strlen(str));
@momonosuke Это, вероятно, хорошее начало, но также потребуется дополнительная работа, поскольку тогда в памяти не будет исходной строки. И, как уже упоминалось, не хватает места для терминатора, если вся исходная строка копируется.
newstring[i]='\0';
Эта строка недействительна. Изменение строковых литералов - это неопределенное поведение. Я бы посоветовал проверить это: ошибка сегментации при использовании указателя
Лучшим решением было бы использовать массивы вместо указателей.
проблема в том, что мне нужно выделить новую память для строки. Это мое задание. Прочитал статью и понимаю, почему мой подход неверен.
В вашем коде есть ряд проблем. Основная проблема в том, что вы не назначаете возвращаемое значение от 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;
}
malloc(sizeof(char)*strlen(str));? Вам нужно узнать, что такое возвращаемые значения и что они означают. Вы создаете блок памяти с этой строкой кода и выбрасываете его, потому что вы не сохраняете возвращаемое значение.