Введение в строки

Строку можно рассматривать как обычный одномерный статический или динамический массив, тип элементов которого символьный (char). Строку можно объявить как обычный статический одномерный массив с фиксированной размерностью: const n=20; char T[n]; Здесь n — наибольшая длина строки. Вводить и обрабатывать можем и более короткие строки, но память объёмом 20 байт на всё время выполнения функции или блока занята для указанного здесь количества символов. Напомним, что каждый символ занимает один байт. Реальную длину строки можно получить с помощью функции strlen(T). Нумерация символов, как и в числовом массиве, с нуля.

Для ввода строки вместо cin лучше использовать специально предназначенную для этого стандартную функцию gets(T); так как cin вводит строку до первого пробела. Для ввода одной строки в отличие от ввода числового массива цикл не нужен.

Строка заканчивается специальным символом “конец строки”, который в тексте программы обозначается ‘’ с одинарными кавычками. Он формируется автоматически при вводе строки после нажатия на клавишу “Enter” или добавляется к записанной строковой константе.

Рассмотрим следующую программу.

const m=20; char T[m]; gets(T);cout

Если введём текст “математика” без никаких кавычек, то выведем 10 20.

Как и обычный числовой массив, строку также можно инициализировать при объявлении. Для этого указываем размерность, достаточную для размещения текста и символа конца строки (‘’). Этот символ надо явно записать, например: char T[11]={‘м’,’а’,’т’,’е’,’м’,’а’,’т’,’и’,’к’,’а’,’’}; Так как для каждого символа надо записывать кавычки и разделять символы запятой, то есть более простой способ: char T[11]=“математика”; В этом случае нулевой символ добавляется к концу строки автоматически. Более того, размерность строки можно не указывать: char T[]=“математика”; Тогда она определяется в зависимости от реальной длины строки.

Для вывода строки кроме cout и printf с форматом “%s” можно использовать специальную функцию puts(T). После вывода курсор перемещается в начало следующей строки окна вывода.

В функцию строку можно передать как обычный одномерный массив.

Пример 4. Составить и проверить функцию, которая в одной строке находит количество цифр и количество введённого символа.

void STRDIGIT (char t[],char , int , int );

// или void STRDIGIT (char *t,char , int , int );

int main()

{ /* Объявляем строку наибольшей длины 50 */ char str[50];

gets(str); // Ввод строки

char c1; /*Переменная для одного символа */

int KDig, KC; cout

c1=getchar(); // ввод одного символа

STRDIGIT(str,c1,KDig,KC); cout

puts(str); /* Вывели строку, или printf ( “%sn”, str) */

cout

getch(); return 0; }

void STRDIGIT(char t[],char Ch,int K1, int K2)

{ K1=0; K2=0;

for (int i=0; i

// strlen возвращает длину строки

{ if (t[i]=’0′ t[i]

if (t[i]==Ch) K2++; }

}

В качестве упражнения подумайте, почему в STRDIGIT не написали else после первого if. Для какого анализируемого символа Ch функция будет одинаково работать, а для какого — нет, если написать else?

Цикл //1 для работы со строкой можно записать по-другому, используя символ конца строки ( ‘’ ) for (int i=0; t[i] !=’’; i++) { …}. Этот символ, как и числовой нуль, играет роль false при сравнении. Поэтому это же можно записать короче: for (int i=0; t[i]; i++) { …}

Так как символы для цифр располагаются в кодовой таблице подряд (коды 48,49, … , 57) и тип char совместим с целым типом, то вместо // 2 можно

if (t[i]=48 t[i]

Анализ одного символа можно выполнить, используя встроенную функцию isdigit, возвращающую true или false в зависимости от того, является один символ цифрой или нет. Поэтому можно предложить более компактный другой вариант нашей функции:

void STRDIGIT (char *t, char Ch, int K1, int K2)

{ K1=K2=0; for (int i=0; t[i];) // 1

{ if ( isdigit(t[i])) K1++; // 2

if (t[i++]==Ch) K2++; }

}

Записать i++ при выволнении первого if будет неправильно. Почему?

Вместо for в строке // 1 можно записать while:

K1=K2=0; int i=0; while (t[i]) {…}

Кроме функции isdigit, есть другие функции, анализирующие один символ, но не строку. Некоторые из них приведены ниже:

  • islower — является ли аргумент символом нижнего регистра (маленькой буквой, например);
  • isupper — является ли аргумент символом верхнего регистра (большой буквой, например);
  • isalpha — является ли аргумент буквой алфавита (верхнего или нижнего регистра);
  • isgraph— является ли аргумент печатным символом, отличным от пробела;
  • isprint — является ли аргумент печатным символом, включая пробел.

Эти и другие подобные функции, имена которых начинаются с is, возвращают true или false в зависимости от того, принадлежит ли символ соответствующей группе. Кроме этого, в эти функции передаётся один символ, а не строка. Поэтому анализ всех символов строки выполняется в цикле, а в функцию передаётся элемент символьного массива ( t[i]).

Во второй части книги будет рассмотрен профессиональный подход для работы со строками, основанный на использовании указателей для организации циклов в любых, не обязательно символьных массивах и большого количества строковых функций.

Строки / Введение в программирование, урок 11 (JavaScript ES6)

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector