// Ввести строку, используя указатели и удалить из нее все вхождения символа а.
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <locale.h>
# include <string.h>
int main(void)
{
//устанавливаем русско язычный вариант вывода информации на экран
setlocale(LC_ALL,"Russian");
//описываем указатель на символьный тип данных
//и сразу же выделяем область памяти размером 50 байт (предполагаемая
//длина строки
char *ptr=(char*)malloc(50*sizeof(char));
//Проверка выделения динамической области памяти
if (!ptr) {printf("Память не выделена"); return 1;}
char *ptr1;
printf("Введите строку: ");
gets(ptr);
//переопределяем динамическую область памяти под истинный размер
//введенной строки, т.к. функция strlen() определяет количество
//видимых симолов, а необходимо учесть и символ конца строки ‘\0’,
// strlen(ptr)+1
ptr=(char*)realloc(ptr,(strlen(ptr)+1)*sizeof(char));
if (!ptr) {printf("Память не выделена"); return 1;}
while(ptr1=strchr(ptr,'a'))
strcpy(ptr1,ptr1+1);
//Переопределяем новый размер строки
ptr=(char*)realloc(ptr,strlen(ptr)*sizeof(char)+1);
printf(" Новая строка ->%s",ptr);
//освобождаем динамическую память
free(ptr);
_getch();
return 0;
}
Пояснения к программе.
while(ptr1=strchr(ptr,'a'))
strcpy(ptr1,ptr1+1);
ptr=(char*)realloc(ptr,strlen(ptr)*sizeof(char)+1);
В данном цикле проверяем вхождения симола а в строке используя функцию strchr(). Если данный символ в строке ptr существует, то переменная ptr1 получит адрес первого вхождения данного символа в строке ptr. Если такого символа в строке нет, то переменная ptr1 получит значение адресного нуля, т.е. NULL и цикл прекратит свою работу. Используя strcpy(ptr1,ptr1+1), копируем последовательность байтов начиная с адреса ptr1+1 и заканчивая ‘\0’ в строку, начинающуюся с адреса ptr1. Таким образом, удаляем все вхождения символа а.
Результат выполнения программы:
Рис. 11. 2 Результат выполнения программы к примеру 27