Способы ввода и вывода символов. Получение кода символа.

символьный тип char. Описание символьных переменных имеет вид:

char a, z;

Для ввода и вывода символьных значений в форматных строках библиотечных функций printf() и scanf() используется спецификатор %c, например:

char c;

printf("Введите символ: ");

scanf("%c",&c);

printf("Вы ввели символ %с", c);

Помимо scanf() и printf() для ввода и вывода символов в библиотеке предусмотрены специальные функции обмена:

getch() – функция без параметров. Позволяет читать с клавиатуры по одному символу за обращение. Как и при использовании scanf(), чтение вводимых данных начинается после нажатия клавиши Enter.

putchar(X) – выводит символьное значение X на экран.

Пример (программа считает число значащих символов (не пробелов) в строке, которая заканчивается точкой):

char c; int n;

printf("Напишите предложение с точкой в конце:\n");

// сначала счетчик символов n равен нулю

// цикл выполняется, пока считанный с клавиатуры символ не равен точке

for (n = 0; (c = getch()) != '.'; )

{

// выводим считанный символ на экран

putch(c);

// если символ не является пробелом, увеличиваем счетчик

if (c!=' ') ++n;

}

printf("\nЧисло введенных символов (без пробелов): %d", n);

Результаты работы программы:

Напишите предложение с точкой в конце:

1 2 3 4 5

Число введенных символов (без пробелов): 5

Внутренние коды и упорядоченность символов.

Данные типа char представлены численными значениями своих внутренних кодов. Благодаря этому возможно упорядочивание символов. Следующая программа выводит на экран десятичные коды символов от 0 до 9:

char c;

for (c='0'; c < '9'; c++)

printf("Символ %c - %d\n", c, c);

Результат работы программы:

Символ 0 - 48

Символ 1 - 49

Символ 2 - 50

Символ 3 - 51

Символ 4 - 52

Символ 5 - 53

Символ 6 - 54

Символ 7 - 55

Символ 8 - 56

Таким же образом можно вывести на экран, например, коды символов от a до z (a будет иметь код 97, b – код 98, и т. д.).

Символьные строки. NULL-символ. Ввод и вывод символьных

строк. Строка считается массивом символов, то есть имеет тип char []. Количество элементов массива char будет на 1 больше, чем число символов в строке за счет добавления нулевого байта. Символьная строка в С++ обязательно должна заканчиваться NULL-символом (записывается как '\0' или NULL). NULL-символ также называют признаком конца строки. Строку можно инициализировать:

1) при определении символьного массива, например (записываем в str строку string и посимвольно выводим ее на экран вместе с кодами символов):

char str[10] = "String";

for (int i = 0; i < 10; i++) printf("%c - %d\n", str[i], str[i]);

В символьный массив размерности 10 может поместиться строка не длиннее 9 символов. При инициализации символьного массива константной строкой можно не указывать размер массива, например:

char str[] = "Это новая строка";

Если инициализация не производится, размер нужно задавать обязательно, то есть строка следующего вида приведет к ошибке компиляции:

char str[];2) С помощью функций ввода-вывода printf(), scanf(), при этом используется спецификатор %s.

char str[15];

printf ("Введите строку: ");

scanf("%s",str);

printf ("Вы ввели строку: %s ", str);

3) с использованием функции копирования строк strcpy(приемник, источник).

Пример использования функции strcpy:

char str1[10], str2[10];

strcpy(str1, "Hello");

strcpy(str2, str1);

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

char str1[10]={0}, str2[10]={0};

strncpy(str1, "Hello world",9);

strncpy(str2, str1,9);

4) с использованием функции gets(). Пример:

char s[80];

gets(s);

Инициализировать символьную строку можно во время ее объявления, например:

char name[5]={'М','a','р','к','\0'};

char name[5]="Марк"; // упрощенный синтаксис для строк

Для ввода/вывода строк с помощью printf(), scanf() используется спецификатор формата %s. Для использования функций работы со строками необходимо подключить заголовочный файл "string.h".

24.Функции работы со строками: назначение, синтаксис, примеры

Использования.

Для лексикографического сравнения строк используются функции int strcmp(строка1, строка2) и int stricmp(строка1, строка2). Первая сравнивает строки с учетом регистра, вторая – без. Все это относится только к латинице. Пример использования функции сравнения строк:

char s[80];

printf("Введите пароль: ");

gets(s);

if(strcmp(s, "pass"))

printf("Неверный пароль\n");

Для вычисления длины строки используется функция strlen (строка). Функция возвращает длину строки за вычетом нулевого байта. Эта функция полезна в случаях, если вам нужно последовательно обратиться ко всем символам строки, не нарушив при этом ее длину. Пример:

char len;

len=strlen(str);

for (i=0;i<len;i++) {

// работа со строкой, не изменяющая ее длину

}

Зачастую требуется преобразовать число в строку и наоборот. Есть несколько способов сделать это.

1) использовать функции sprintf и sscanf. Например, так:

char str[50];

int i=15;

int j;

sprintf(str, "%d", i); // Записать в str строковое представление i

sscanf(str, "%d", &j); // Записать в j число, содержащееся в строке str

sprintf(str, "i=%d and j=%d", i, j);

// содержимое str: "i=15 and j=15"

Функция int sprintf(строка, формат, [аргументы]) работает аналогично printf(), но выводит отформатированное содержимое не на экран, а в строку, указанную в качестве первого аргумента. Функция возвращает значение, равное числу символов, записанных в строку. Пример:

char buffer [50];

int n, a=5, b=3;

n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);

printf ("[%s] is a %d char long string\n",buffer,n);

Функция int sscanf(строка, формат, [аргументы]) осуществляет считывание данных из строки и запись в аргументы в соответствии с форматом. Как и в обычной функции scanf(), перед аргументами ставится &.

Хотя sprintf и sscanf довольно удобны, у них есть несколько недостатков. Во-первых, они не всегда быстро работают, во-вторых не типобезопасны. Например, если в строке формата вы укажите, что передаете два целых, а вместо этого передадите два double, ошибка обнаружится только при выполнении программы и найти ее причину будет не так-то просто.

В-третьих, доступно целое семейство функций atof, atoi, atol и itoa, ltoa. Все они очень похоже между собой. Функции из первой группы преобразуют строку в число (float, int или long) в зависимости от окончания. Функции из второй группы выполняют обратное преобразование.

Пример (первый аргумент функции – число, второй аргумент – строка, третий аргумент – основание системы счисления):

char str1[5];

char str2[5];

char str3[5];

itoa(12, str1, 10); //str1=”12”

itoa(12, str1, 16); //str1=”C”

itoa(12, str1, 2); //str1=”1100”

strupr(строка) – преобразует строку в верхний регистр

strlwr(строка) – преобразует строку в верхний регистр

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

strset(строка,символ) – заменяет все символы строки на указанный символ

strrev(строка) – меняет порядок символов в строке на противоположный*

char title[]="C++ strings";

cout << strupr(title) << endl;

cout << strlwr(title) << endl;

cout << strlen(title) << endl;

cout << strrev(title) << endl;

cout << strset(title,'x') << endl;

25.Указатель. Синтаксис объявления указателя. Способы инициализации указателей.Примеры. Указатель – это переменная, в которой хранится адрес области памяти.

Синтаксис объявления указателя на объект:

тип *имя_указателя;

* относится непосредственно к имени, поэтому ее требуется ставить перед именем каждого указателя в объявлении.

Инициализация указателя:

1) Присваиваем указателю адрес с помощью операции взятия адреса &;

char *pch = &ch; // заносим в pch адрес ch

int *pi = &i;

float *pf = &f;

double *pd = &d;

2) Присваиваем указателю значение другого инициализированного указателя;

int i = 10;

int *pi1 = &i; // pi1 указывает на i

int *pi2 = pi1; // pi2 тоже указывает на i

3) Присваиваем имя массива (оно трактуется как адрес начала массива)

int arr[3]={1,2,3};

int *parr = arr; // обратите внимание, что в этом случае не используется оператор взятия адреса &

4) Присваиваем адрес области памяти в явном виде;

char * pch = (char*)0xB8000000;

5) Присваиваем пустое значение.

double *pd = NULL;

float *pf = 0;

Разыменование указателей. Арифметические операции над указателями. Связь указателей и массивов. Примеры.

Операция разадресации (разыменования) предназначена для получения доступа к величине, адрес которой хранится в указателе.

int i = 10; // i = 10

cout << "Initial value of i = " << i << endl;

int *p = &i; // p указывает на i

cout << "Initial value of *p = " << *p << endl;

*p = 15; //*p – значение по адресу в p

cout << "New value of *p = " << *p << endl;

cout << "New value of i = " << i << endl;int k = *p; // k присвоить значение по адресу в p

cout << "Initial value of k = " << k << endl;

k = k + 3;

cout << "New value of k = " << k << endl;

cout << "New value of *p = " << *p << endl;

Initial value of i = 10

Initial value of *p = 10

New value of *p = 15

New value of i = 15

Initial value of k = 15

New value of k = 18

New value of *p = 15

Арифметические операции: сложение с константой, вычитание, инкремент и декремент. Автоматически учитывается размер типа переменной, на которую настроен указатель. Применяются в основном при работе с массивами. Инкремент перенастраивает указатель на следующий элемент массива, а декремент – на предыдущий. Фактически значение указателя изменяется на величину sizeof(тип)

int arr[5]={1,2,3,4,5}, *parr = arr;

// *parr = 1

++parr;

// *parr = 2

parr+=2;

// *parr = 4

Разность двух указателей – это разность их значений, деленное на величину типа в байтах

int arr[5]={10,12,3,15,5}, *parr1

= arr, *parr2 = &arr[3];

cout << "parr2 - parr1 = " <<

parr2 - parr1 << endl; // 3

cout << "*parr2 - *parr1 = " <<

*parr2 - *parr1 << endl; // 5

Наши рекомендации