Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

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

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

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

const m=20; char T[m]; gets(T);cout<<strlen(T)<<” “ << sizeof(T)<<endl;

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

Как и обычный числовой массив, строку также можно инициализировать при объявлении. Для этого указываем размерность, достаточную для раз­мещения текста и символа конца строки (‘\0’). Этот символ надо явно записать, например: char T[11]={‘м’,’а’,’т’,’е’,’м’,’а’,’т’,’и’,’к’,’а’,’\0’}; Так как для каждого символа надо записывать кавычки и разделять символы запятой, то есть более простой способ: 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<<"Input the symbol ";

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

STRDIGIT(str,c1,KDig,KC); cout<<"In the string ";

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

cout<< KDig<< " digits and " <<KC << " of simbols "<<c1;

getch(); return 0; }

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

{ K1=0; K2=0;

for (int i=0; i<strlen(t); i++) // 1

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

{ if (t[i]>='0' && t[i]<='9') K1++; // 2

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

}

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

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

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

if (t[i]>=48 && t[i]<=57) K1++;

Анализ одного символа можно выполнить, используя встроенную функцию 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]).

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





Дата публикования: 2015-02-18; Прочитано: 227 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.014 с)...