- •Массив и указатель: различия
- •Ввод-вывод символьных данных и строк
- •1) Ввод-вывод одиночного символа
- •Например:
- •Например:
- •Внутренние коды символов
- •Функции для работы со строками
- •Пример 7.
- •Пример 8.
- •Пример 24.
- •Пример 25.
- •Пример 26:
- •Пример 27
- •Ключевые термины
- •Краткие итоги
- •Контрольные вопросы
- •Задание.
Пример 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
Ключевые термины
Внутренние коды символов – целые числа, однозначно соответствующие символам во внутреннем представлении.
Инициализация строки – определение значения строки.
Размер строки – объем памяти, занимаемой строкой, выраженный в байтах.
Символ конца строки – нулевой байт, являющийся признаком конца строки символов.
Символьная константа – константа типа char.
Символьная переменная – переменная типа char.
Строка – это пронумерованная последовательность символов, заключенная в двойные кавычки.
Конкатенация строк – это результат последовательного соединения строк.
Лексикографический порядок – правило сравнения символов, основанное на величине кода внутреннего представления каждого символа.
Пустая строка – это строка единичной длины, содержащая только символ конца строки.
Сравнение строк – это результат проверки выполнения отношения "больше", "меньше" или "равно" над строками.
Стандартные функции по работе со строками – это функции обработки строк, прототипы которых входят в стандартные библиотеки С
Адрес строки – это указатель на блок непрерывной области памяти, с которого начинает располагаться массив символов.
Строки как параметры функций – это описание передачи значений строк в функции как массив символов или указатель типа char.
Указатель на строку – адрес начала расположения строки в памяти.
