Пример 27

// Ввести строку, используя указатели и удалить из нее все вхождения символа а.

# 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: