Ввод-вывод символьных данных
Для ввода символьных данных используются функции: scanf() – форматированный ввод, getchar() или getch() – специальные функции для ввода символа. Для форматного ввода и вывода символьных констант используется спецификатор (формат) %с. Необходимо помнить, что нажатие любой небуквенной клавиши при вводе ([пробел], [Enter] и др.) будет значимым и восприниматься как символ.
Пример 1. Организовать ввод символьных переменных:
a='i' b='j' c='k'
main()
{ char a,b,c;
printf("Введите исходные данные");
scanf("%c%c%c",&a,&b,&sc);
. . .
}
При вводе символы набираются без апострофов и пробелов:
ijk [Enter]
Символ клавиши [Enter] выходит за пределы списка ввода, поэтому он игнорируется.
При вводе символьной информации с помощью функции getchar() надо помнить, что функция переводит программу в состояние ожидания, но при нажатии клавиши символ выводится на экран. А, например, при выполнении следующего фрагмента программы
printf("Введите исходные данные");
a=getch();b=getch();c=getch();
переменные будут введены, но на экране их значения не отразятся.
Для вывода символьных данных используются функции printf() и putchar().
Пример 2. Организовать вывод указанных выше переменных на экран в одну строку. Запись оператора вывода будет следующей:
printf("%c%c%c\n",a,b,c);
Нa экране будет отображено:
ijk
Если использовать для вывода функцию putchar():
putchar(a); putchar(b); putchar(c);
на экране будет отображен тот же результат.
Обработка символьных данных
Поскольку символы в языке С++ упорядочены, к ним можно применять операции отношения (>, >=, <, <=, = =, !=). Это дает возможность записывать логические выражения с символьными данными в условных операторах. Например, оператор
if (ch =='!' ) ch ='.';
сравнивает значение переменной ch с символом ‘!’ и в случае их равенства следующая команда заменяет в символьной переменной ch восклицательный знак точкой.
Символьные данные могут использоваться и в операторах цикла for. Так, при выполнении операторов:
for( ch='a'; ch>='d'; ch++) printf("%с",ch);
в строку экрана выводится последовательность:
a b с d
Если значение символьной переменной вывести с помощью спецификатора для целых чисел %d, то на экране отобразится код символа. Например:
for(ch='a'; ch>='d'; ch++) printf("%d ",ch);
на экран будет выведено:
97 98 99 100
Над символьными данными можно выполнять арифметические операции сложения и вычитания. Так, например, операция ch++; из предыдущего примера увеличивает код символа, хранящегося в переменной ch на 1. Или, выполняя операцию ch='a'-'A'; будет получена разница кода большой (А) и маленькой буквы (а) латинского алфавита. Так, например, если в символьной переменной ch1 хранится маленькая буква алфавита, то, выполнив действия:
char ch,ch1,ch2;
ch='a'-'A';
ch1='k';
ch2=ch1-сh;
printf("%c-%d %c-%d\n",ch1,ch1,ch2,ch2);
в переменную ch2 запишется та же буква, только большая, а на экран будет выведено
k-107 K-75
Строки
Значением строки является любая последовательность символов. Причем для компьютера – это набор байтов.
Строковая константа - это строка, заключенная в кавычки, например:
“Язык программирования”
Строковая переменная или строка представляет собой массив символов, поэтому и объявляется она именно так:
сhar st[30];
В квадратных скобках указывается максимальное число символов в строке st.
Под значение строковой переменной в памяти компьютера отводится МАХ байт, пронумерованных от 0 до МАХ-1, где МАХ - объявленный размер строки.
Строка отличается от несимвольного массива тем, что она заканчивается кодом 0 - признаком окончания строки. По местоположению этого специального символа определяется фактическая длина строки.
Начальное значение строки можно задать при ее объявлении следующим образом:
char s[80] = "Язык программирования Си";
Символы в кавычках будут записаны в начало массива s, а затем - признак окончания строки '\0'.
При описании строки можно также написать так:
char s[] = "Язык программирования Си";
В этом случае компилятор подсчитает символы в кавычках, выделит памяти на 1 байт больше и занесет в эту область саму строку и завершающий ноль.
Ввод-вывод строковых данных
При вводе строк, как и символов, используется функция scanf(). При этом для форматного ввода и вывода строк используется спецификатор %s. Однако нажатие клавиши [Enter] или клавиши [пробел] не является значимым символом. При вводе строки с помощью функции scanf() нажатие одной из этих клавиш формирует символ конца строки. Таким образом надо помнить, что функция scanf() позволяет записать в строку только одно слово.
Пример.Организовать ввод ФИО студента.
char fam[20];
printf ("Введите фамилию и инициалы студента");
scanf("%s", fam);
На клавиатуре строка набирается без кавычек, например:
Андреева С.В. [Enter]
Одновременно с вводом строки в байт с индексом восемь запишется символ с кодом 0. Инициалы студента в эту строку записаны не будут, так как пробел после фамилии будет воспринят командой scanf как конец строки.
Для ввода текста содержащего пробелы следует использовать специальную функцию gets(). При вводе строки с помощью этой функции только нажатие клавиши [Enter] сформирует символ конца строки.
Так, например, в предыдущей задаче:
char fam[20];
printf(“Введите фамилию и инициалы студента”);
gets(fam);
использование функции gets() позволит записать в строку fam не только фамилию, но и инициалы.
Вывод строк осуществляется с помощью функции printf() и специальной функции puts(). Например, оператор
printf(“| %20s|”,fam);
выведет на экран в правую часть поля из 20 позиций строку fam:
| Андреева С.В.|
Специальная функция puts() позволяет вывести содержимое строки и переводит курсор на следующую строку. Например:
putchar(‘|’); puts(fam); putchar(‘|’);
приведет к получению следующего результата:
|Андреева С.В.
|
Последний символ будет выводиться в следующей строке экрана.
Обработка строковых данных
К любому символу строки можно обратиться как к элементу одномерногомассива, например, запись st[i] определяет i-ый символ в строке st. Поэтому при решении некоторых задач обработку строковых данных можно проводить посимвольно, организуя циклы для просмотра строки.
Например: Дано предложение. Определите количество слов в нем.
Решение:
Слова в предложении разделяются пробелами. Подсчитав количество пробелов, можно определить количество слов, учитывая, что между словами введен только один пробел.
#include "stdafx.h"
#include<string.h>
int main()
{ char slova[120];
int i, n, k=1;
printf("Введите предложение\n");
gets(slova);
n= strlen(slova); // функция strlen() возвращает длину строки
for(i=0;i<n; i++)
if(slova[i]==' ')k++; //поиск и подсчет пробела
printf("k=%d\n",k);
return 0;
}