Для начала, чтобы удалить символ из строки, нет необходимости динамически создавать массив символов, а затем копировать этот массив в исходную строку.
Либо вы должны написать функцию, которая действительно удаляет указанный символ из строки, либо функцию, которая создает новую строку на основе исходной строки, исключая указанный символ.
Это просто плохой дизайн, который только смущает пользователей. То есть функция слишком сложна и использует избыточные функции, такие как malloc
, strlen
, strcmp
и strcpy
. И на самом деле у него есть побочный эффект, который не очевиден. Кроме того, используется некорректный тип int
для длины строки вместо типа size_t
.
Что касается реализации вашей функции, то вы забыли добавить завершающий ноль '\ 0' к строке, построенной в динамически выделенном массиве.
Если вы действительно хотите удалить символ из строки, функция может выглядеть так, как показано в демонстрационной программе.
#include <stdio.h>
char * remove_char(char *s, char c)
{
char *p = s;
while (*p && *p != c) ++p;
for ( char *q = p; *p++; )
{
if (*p != c) *q++ = *p;
}
return s;
}
int main( void )
{
char str[] = "Input string";
puts(str);
puts(remove_char(str, 'g'));
return 0;
}
Вывод программы
Input string
Input strin
Если вы изучаете функцию malloc
и хотите ее использовать, вы в любом случае должны попытаться реализовать правильный дизайн.
Чтобы использовать malloc
, вы можете написать функцию, которая создает новую строку на основе исходной строки, исключая указанный символ. Например
#include <stdio.h>
#include <stdlib.h>
char * remove_copy_char(const char *s, char c)
{
size_t n = 0;
for (const char *p = s; *p; ++p)
{
if (*p != c) ++n;
}
char *result = malloc(n + 1);
if (result)
{
char *q = result;
for (; *s; ++s)
{
if (*s != c) *q++ = *s;
}
*q = '\0';
}
return result;
}
int main( void )
{
char *str = "Input string";
puts(str);
char *p = remove_copy_char(str, 'g');
if ( p ) puts(p );
free(p);
return 0;
}
Вывод программы будет таким же, как указано выше.
Input string
Input strin
Обратите внимание на объявление функции
char * remove_copy_char(const char *s, char c);
^^^^^^
В этом случае исходная строка может быть строковым литералом.
char *str = "Input string";
19.06.2017