Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по программированию и алгоритмизаци...doc
Скачиваний:
31
Добавлен:
05.09.2019
Размер:
2.24 Mб
Скачать

Объявление typedef применяется для создания удобных распознаваемых имен часто встречающихся и для вложенных типов, а также, чтобы сделать программы переносимыми для различных целых типов.

4.6. Обработка символьных и строковых переменных

Для представления символа (литеры) используется тип char. Значением данного типа char является код в наборе таблицы ASCII, соответствующий данному символу. Та как тип char по умолчанию интерпретируется как однобайтовая целая величина со знаком, то диапазон значений переменной от -128 до +128, хотя только значения от 0 до 127 имеют символьные эквиваленты. Переменные типа unsigned char могут орпеделять значения в диапазоне от 0 до 255.

Символьные константы заключаются в апострофы. Символьные переменные могут соответствовать либо символьным константам, которые можно вывести на печать, либо управляющим константам, например: char а=’A’, f=’\n’;

Строковая константа представляет собой последовательность символов, заключенную в кавычки (“), например, “это моя первая строка”. В конце каждого строкового типа данного компилятором добавляется нулевой символ, представляемый управляющей константой \0.

Строковая переменная описывается как char st[12], в квадратных скобках указывается длина строки. Это означает, что строковая переменная – массив символов, причем нумерация элементов массива начинается с нуля, и число элементов массива равно числу символов плюс единица.

Строковые константы могут располагаться в нескольких строках. Для формирования таких строковых констант можно использовать обратну дробную черту с последующим нажатием Enter. Такая строка считается продолжением предыдущей, например, строка символов:

“Это очень длин\

ная строка символов”

идентична строке символов “Это очень длинная строка символов”.

Для описания строковой переменной можно воспользоваться понятием массива символов или указателя (ссылки) на массив символов, например:

char mas[15]; char*st;

В результате выполнения команды char mas[15] компилятор зарезервирует область памяти для 14 символов, а 15-ый элемент будет заполнен нулевым символом ‘\0’, st – указатель на массив символов, этой переменной должен присваиваться адрес начала строки.

Для ввода/вывода символьных/строковых типов днных можно воспользоваться не только функциями printf() и scanf(), но и рядом других функций, прототипы которых описаны ы библиотечном файле stdio.h, например, puts(), puchar(), gets(), getchar().

Функция int putchar(char c) выводит одиночный символ в стандартный выходной поток stdout без последующего перехода к новой строке.

Функция int getchar() применяется для ввода очередного символа из стандартного входного потока stdin. Эта функция не требует задания параметра и принимает значение целого типа. Если переназначения стандартного входного потока не было, то ввод осуществляет ся с клавиатуры; при вводе из файла, назначенного для входного потока, его имя указывается в командной строке при вызове программы, например:

char ch;

ch=getchar();

putchar(ch);

Функция int puts(char *st) используется для вывода строки символов в стандартный выходной поток. Строка символов дополняется символом конца строки ‘\n’, и после вывода строки символов функцией puts() переход к новой строке происходит автоматически.

Пример.

#include<stdio.h>

void main()

{char mas[15], *st;

….

puts(mas); puts(st);

}

Функция char *gets(char *st) выполняет считывание из стандартного входного потока. Ввод продолжается до тех пор, пока не будет нажата клавиша Enter. Эта функция дополняет строку введенных символов символом ‘\0’.

Пример.

#include<stdio.h>

void main()

{char mas[15], *st;

….

gets(mas); gets(st);

}

Если число представлено в виде строки символов, то можно воспользоваться функциями int atoi (строка символов), long atoll (строка символов), double atof (строка символов) для преобразования строки, соответственно в целое, длинное целое или вещественное число. Прототипы этих функций описаны в библиотечном файле stdlib.h. Если строка не может быть преобразована в число, то возвращается нуль.

В языке С++ существует группа операторов для работы с символьными переменными (табл. 8), которые описаны в загрузочном файле ctype.h.

Таблица 8

Операторы, для работы с символьными переменными

Синтаксис

Описание

isalpha(c)

Функция проверяет, является ли символ с буквой

isdigit(c)

Функция проверяет, является ли символ с цифрой

islower(c)

Функция проверяет, является ли символ с строчной буквой

isspace(c)

Функция проверяет, является ли символ с пустым символом (пробел, табуляция или новая строка)

isupper(c)

Функция проверяет, является ли символ с прописной буквой

isalnum(c)

Функция проверяет, является ли символ с алфавитноцифром (буква или цифра)

isascii(c)

Функция проверяет, является ли символ с кодом ASCII(0-127)

iscntrl(c)

Функция проверяет, является ли символ с управляющим символом

ispunct(c)

Функция проверяет, является ли символ с знаком пунктуации

toupper(c)

Функция преобразует символ с в прописную букву

tolower(c)

Функция преобразует символ с в строчную букву

Для работы со строкой символов в файле string.h описаны прототипы ряда функций. Библиотека представляет возможности копирования (strcpy, strncpy), сравнения (strcmp, strncmp), объединения строк (strcat, strncat), поиска подстроки (strstr), поиска вхождения символа (strchr, strrchr, strpbrk), определения длины строки (strlen) и т.д., а также содержит специальные функции ввода строк и отдельных символов с клавиатуры и из файла.

Пример.

#include <stdio.h>

#include <string.h>

void main()

{char s[80], passw[]}=”kuku”; // passw – эталонный пароль.

// Можно описать как *passw=”kuku”

int i, k=0;

for(i=0;!k && i<3; i++)

{printf(“Введите пароль: \n”);

gets(s); // функция ввода строки

if (strstr(s,passw)) k=1; // функция сравнения строк

}

if (k) printf(“\n Пароль принят”);

else printf(“\n Пароль не принят”);

return 0;

}

Следует помнить, что операция присваивания одной строки другой не определена (поскольку строка является массивом) и может выполняться с помощью цикла или функции из стандартной библиотеки. Процесс копирования строки scr в строку dest проиллюстрируем на следующем примере:

char scr[10], dest[10];

for(int i=0;i<=strlen(scr); i+) dest[i]=scr[i];

Для этой же операции можно реализовать другой алгоритм, который является более эффективным, поскольку не требует повторного просмотра строки scr:

#include<iostream.h>

void main()

{char *scr = new char [10]; // new – оператор, обеспечивающий

// выделение динамической памяти в куче.

char *dest = chat [10], *d=dest;

cin>>scr;

while (scr!=0)

*d++ = *scr++;

*d=0; // условие останова цикла

cout<< dest;

return 0;

}