У вас проблемы с чтением del
после чтения строки, потому что scanf()
, используемый для чтения строки, оставляет последний \n
во входном буфере без использования, если ваша строка формата похожа на
scanf("%s", stringname);
scanf("%c", charactername);
Вы можете решить эту проблему с помощью
scanf("%s", stringname);
scanf(" %c", charactername);
добавление пробела перед %c
в scanf()
, используемом для чтения символа. Это будет использовать любой символ пробела, оставшийся во входном буфере до чтения фактического символа.
Это связано с тем, что для %c
начальные пробелы не пропускаются автоматически.
Обратите внимание, что вы выделяете память только для одного символа с
char* texto;
texto=(char*)calloc(0,sizeof(char));
вместо этого вы могли бы сделать
char* texto;
texto=calloc(0,sizeof(char)*10);
где 10
- размер строки, включая символ \0
. Таким образом, вы можете прочитать максимум 9 символов в texto
, иначе произойдет переполнение.
Чтобы избежать переполнения, при чтении с scanf()
используйте спецификатор ширины, как в
scanf("%9s", texto);
Вам не нужно явно приводить возвращаемое значение calloc()
в C. Преобразование в char *
из void *
, возвращенного calloc()
, будет выполнено неявно.
А для удаления можно просто сделать
char* deleteChar(char* texto,int n,char del,int i,int j)
{
char *ptr=strchr(texto, del);
if(ptr!=NULL)
{
sprintf(texto, "%.*s%s", ptr-texto, ptr+1);
}
}
Вам не нужно возвращать texto
, потому что то, что было передано, является массивом.
char* deleteChar(char* texto,int n,char del,int i,int j)
{
char *ptr=strchr(texto, del);
if(ptr!=NULL)
{
sprintf(texto, "%.*s%s", ptr-texto, texto, ptr+1);
}
}
strchr()
используется для получения первого вхождения символа в строку.
Кроме того, тип возврата main()
не должен быть void
. См. Тип возврата основной функции .