Обработка символьных данных
Язык Си лучше всего подходит для
системной работы: написания компиляторов,
интерпретаторов, опрерационных систем,
редакторов текста и.т.п. В стнадартной библиотеке
Си предусмотренымногие полезные функции,
выполняющие простые действия с символьными
данными. Рассмотрим из них - putchar и getchar
выполняющие ввод и вывод символа
соответственно и создадим на их основе ряд своих
полезных функций.
Функция getchar за одно обращение к ней
выдает в качестве результата один символ,
поступивший с системного ввода. Мы можем
рассматривать getchar как функцию, имеющую
заголовок
int getchar()
видите, у нее
совсем нет аргументов и она возращает значение
типа - это значение символа во внутреннем
представлении его для данной ЭВМ(напрмер в ACSII).
Таким образом после обращения
c = getchar()
переменная
с содержит очередной символ, набранный
вами на клавиатуре.
Функция putchar за одно обращение к ней
выдает один символ в стандарный выходной поток.
Вызов этой функции имеет вид:
putchar(c);
c-
переменная символьного типа, котрой
предварительно было присвоено некоторое
значение. Рассмотрим примеры. Программа (пример
2.7) вывводит на экран все прописные латинские
буквы. Мы уже напоминали что типы char и int
взаимозаменяемы. Последовательное прибавление к
очередному значению с обеспечивает
выбор очередной буквы ввиду их лексической
упорядоченности.
Пример 2.7
#include <stdio.h>
main()
{
char c;
c='A'
while(c<='Z')
{
putchar(c);
c=c+1;
}
} |
Прежде,
чем перейти к рассмотрению примеров, обсудим, как
машина должна определять конец входного потока
символов, вводимых с клавиатуры терминала. Можно,
конечно, выбрать некоторый символ как признак
конца потока, но нужна гарантия, что он нигде не
повторится. В использованной нами операционной
системе для получения такого символа надо нажать
CTRL+Z. В программе значение этого символа мы будем
использовать через символическое имя EOF(end
of file). Теперь мы можем написать программы
копирования файла(прмер 2.8) . Пока не обнаружен
конец входного потока, ЭВМ получает с клавиатуры
символ (это делает функция getchar) и сразу
же выодит его на экран дисплея с помощью функции putchar.
Для завершения программы достаточно нажать CTRL+Z.
Пример 2.8
/*ЭХО ПРОГРАММА*/
#include <stdio.h>
main()
{
char c;
c=getchar();
while(c!=EOF)
{
putchar(c);
c=getchar();
}
} |
Программу копирования можно написать и более
компактно. В языке Си любое присваивание
например, c=getchar(), можно использовать в
любом выражении в качестве операнда; его
значение - это просто значение, присваиваемое
левой части. Учитывая сказанное, перепишем Эхо
Программу (Пример 2.9) . Это компактная, элегантная
программа принимает символ с клавиатуры и
присваивает его переменной с, а затем
сравнивает его с признаком конца файла. Пока этот
признак не обнаружен, выполняется тело цикла и
символ выдается на экран. В противном случае
цикл, а вместе с ним и вся программа завершаются.
Пример 2.9
*ЭХО ПРОГРАММА ВАР2.*/
#include stdio.h
main()
{
char c; while((c=getchar())!=EOF)putchar(c);
} |
Отметим, что включение присваиваний в проверки -
силбное единство языка, способствующее созданию
программ. Учтите, что скобки вокруг присваивания
внутри условия необходимы: приоритет операции !=
выше приоритета операции присваивания.
Следующяя программа (пример 3.0)
подсчитывает количество строк, слов и символов
во введенном с клавиатуры тексте. Слово - любая
последовательность символов, не содержащяя
знаков табуляции ("\t"),
пробелов и символов "\n". Будем
предполагать также, что любая строка, в том числе
и последняя, завершается символом перехода на
новую строку "\n". Обратите
внимание на строку line= word=kc=0; в которой
трем переменным приваивается значение нуля.
Выражения, связанные логическими операциями &&(И)
и || (ИЛИ) вычисляются слева на право. Как
только истинность или ложность станет
известной, дальнейшие вычисления
прекращяются Таким образом в
строке if(s==' ' || s=='\n' || s=='\t')
символ s содержит пробел, то
остальные две проверки уже не делаются. Отсюда
следует выжный для практики вывод: первыми надо
проверять наиболее часто встречающиеся символы.
Пример 3.0
/*подсчет строк, символов, слов*/
#include <stdio.h>
main()
{
int c,line,word,kx,inword=0;
line=word=kc=0;
while((c=getchar())!=EOF)
{
kc=kc+1;
if(c=='\n') line=line+1;
if(c=='' || c=='\n' || c=='\t') inword=0;
else
if(!inword)
{
inword=1;
word=word+1;
}
}
printf("\n");
printf("строк - %d\n",line);
printf("символов - %d\n",kc);
}
|
< Дальше >
|