Способы ввода и вывода символов. Получение кода символа.
символьный тип 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