Книга: Язык Си - руководство для начинающих
ПРОВЕРКА И ПРЕОБРАЗОВАНИЕ СИМВОЛОВ
ПРОВЕРКА И ПРЕОБРАЗОВАНИЕ СИМВОЛОВ
Заголовочный файл ctype.h содержит несколько функций макроопределений, которые проверяют, к какому классу принадлежат символы. Функция isalpha(c), например, возвращает ненулевое значение (истина), если с является символом буквы, и нуль (ложь), если символ не является буквой. Таким образом,
isalpha('S') != 0, но isalpha('#') ==0
Ниже перечислены функции, чаще всего находящиеся в этом файле. В каждом случае функция возвращает ненулевое значение, если с принадлежит к опрашиваемому классу, и нуль в противном случае.
ФУНКЦИЯ | ПРОВЕРЯЕТ, ЯВЛЯЕТСЯ ЛИ С | ||
---|---|---|---|
isalpha(c) | буквой | ||
isdigit(c) | цифрой | ||
islower(c) | строчной буквой | ||
isspace(c) | пустым символом (пробел, табуляция или новая строка) | ||
isupper(c) | прописной буквой |
Ваша система может иметь дополнительные функции, такие как
ФУНКЦИЯ | ПРОВEРЯEТ, ЯВЛЯЕТСЯ ЛИ С | ||
---|---|---|---|
isalnum(c) | алфавитноцифровым (буква или цифра) | ||
isascii(c) | кодом ASCII (0-127) | ||
iscntrl(c) | управляющим символом | ||
ispunct(c) | знаком пунктуации |
Еще две функции выполняют преобразования
toupper(c) | преобразует с в прописную букву | ||
tolower(c) | преобразует с в строчную букву |
В некоторых системах преобразование выполняется только в случае, если символ находится в регистре (прописных или строчных букв), противоположном тому, с которого следует начинать. Однако надежнее предварительно проверить регистр.
Ниже (рис. 15.3.) дана программа, использующая некоторые из этих функций для преобразования всего файла в прописные или строчные буквы, по вашему желанию. Для получения небольшого разнообразия используем диалоговый подход, вместо того чтобы применять аргументы командной строки для снабжения программы информацией.
/* преобразование строчных букв в прописные и обратно */
#include <stdio.h>
#include <ctype.h> /* включает файл макроопределений */
#define UPPER 1
#define LOWER 0
main( )
{
int crit; /* для установки регистра прописных или строчных букв */
char file1[14], file2[14]; /* имена входного и выходного файлов */
crit = choose( ); /* выбирает прописные или строчные буквы */
getfiles(file1, file2); /* получаст имена файлов */
conv(file1, file2, crit); /* выполняет преобразование */
} choose( )
{ int ch;
printf("Программа преобразует весь файл в прописные буквы или n");
printf(" в строчные буквы. Вводит U, если нужны прописные буквыn");
printf(" или вводит L, если нужны строчные буквы. n");
while((ch=getchar( ))!='U' && ch!='u' && ch!='L'
&& ch!='l')
printf(" Введите, пожайлуста, U или L.n");
while(getchar( )!='n')
; /* сбрасывает последний символ новой строки */
if(ch =='U' || ch =='u')
{ printf(" Все в порядке, есть регистр прописных букв.");
return(UPPER);
else
{ printf(" Все в порядке, есть регистр строчных букв.");
return(LOWER); } }
getfiles(namel, name2);
char *namel, name2;
{ printf(" Какой файл вы хотите преобразовать?n");
gets(name1);
printf(" Это" %s" .n", name1);
printf("Какое имя вы хотите выбрать для преобразуемого файла?n");
while(strcmp(gets(name2), name1) == NULL)
printf(" Выберите другое имя.n" );
printf(" Ваш выходной файл" %s ".n", name2);
} conv(name1, name2, crit);
char *name1, name2;
int crit;
{ int ch;
FILE *f1, *f2;
if((f1 = fopen(name1, "r" )) == NULL)
printf(Извините, я не могу открыть % s. До свидания.n", name1);
else
{ puts(" Итак, начнем!");
f2 = fopen(name2, "w");
while((ch = getc(f1)) != EOF)
if(crit == UPPER)
ch = islower(ch) ? toupper(ch) : ch;
else
ch = isupper(ch) ? tolower(ch) : ch;
putc(ch, f2);
} fclosc(f2);
fclosc(f1);
puts("Сделано!");
} }
РИС. 15.3. Программа преобразования строчных букв в прописные и обратно.
Мы разделили программу на три части: получение от пользователя указания о виде преобразования, получение имени входного и выходного файлов и выполнение преобразования. Чтобы осуществить все это, мы создали разные функции для каждой части. Функция choose( ) довольно проста за исключением, может быть, цикла
while(getchar( ) != 'n');
Этот цикл включен для решения проблемы, с которой мы столкнулись в гл. 14. Когда пользователь отвечает на вопрос о виде преобразования, скажем, буквой U, он нажимает клавишу U, а затем клавишу [ввод], которая передает 'n'.
Первоначальная функция getchar( ) извлекает U, но оставляет 'n' для следующего чтения строки. Функция gets(), входящая в getnames(), интерпретировала бы 'n' как пустую строку, поэтому мы использовали малый цикл while, чтобы избавиться от символа "новая строка". Действительно, простая getchar( ), сделала бы это, если бы пользователь непосредственно за U нажимал бы [ввод]. Но наша версия, кроме того, предусматривает возможность нажать на клавишу пробела несколько раз перед [ввод].
В функции getnames( ) для вас не должно быть сюрпризов. Учтите, что мы запрещаем пользователю применять одинаковые имена для выходного и входного файлов. Стандартная версия функции fopen( ) не позволяет вам и читать и записывать один и тот же файл, если вы открыли его один раз.
Функция conv( ) является функцией копирования с выполнением преобразования. Значение crit используется для определения требуемого преобразования. Работа выполняется простым условным оператором, таким как
ch = islower(ch) ? toupper(ch) : ch;
Он проверяет, является ли ch строчной буквой. Если да, то символ преобразуется в прописную букву. Если нет, остается как есть.
Макрофункции файла ctype.h предоставляют удобные и полезные средства для программирования. Теперь давайте займемся некоторыми более сложными функциями преобразования.
- ДОСТУП В БИБЛИОТЕКУ ЯЗЫКА СИ
- БИБЛИОТЕЧНЫЕ ФУНКЦИИ, КОТОРЫЕ МЫ ИСПОЛЬЗОВАЛИ
- СВЯЗЬ С ФАЙЛАМИ
- ЧТО ТАКОЕ ФАЙЛ?
- ПРОСТЫЕ ПРОГРАММЫ ЧТЕНИЯ ФАЙЛА: fopen( ), fclose( ), getc( ) и putc( )
- ПРОСТАЯ ПРОГРАММА СЖАТИЯ ФАЙЛА
- ВВОД-ВЫВОД ФАЙЛА: fprintf( ), fscanf( ), fgets( ) И fputs( )
- ПРОИЗВОЛЬНЫЙ ДОСТУП: fseek( )
- ПРОВЕРКА И ПРЕОБРАЗОВАНИЕ СИМВОЛОВ
- ПРЕОБРАЗОВАНИЯ СИМВОЛЬНЫХ СТРОК: atoi( ), atof( )
- ВЫХОД: exit( )
- РАСПРЕДЕЛЕНИЕ ПАМЯТИ: malloc( ) И са11ос( )
- ДРУГИЕ БИБЛИОТЕЧНЫЕ ФУНКЦИИ
- ЗАКЛЮЧЕНИЕ
- ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
- ВОПРОСЫ И ОТВЕТЫ
- УПРАЖНЕНИЯ
- Определение класса символов и преобразование символов
- Преобразование XML в реляционную базу данных
- Имена объектов длиной 68 символов
- Преобразование строки в целое: stoi( )
- 5. Null-значения и проверка условий
- На сайтах вместо текста отображается непонятный набор символов
- В Adobe Acrobat Reader русский текст на экране читается нормально, а при печати получается текст из набора символов. Как...
- Наборы символов Firebird
- 7. Лекция: Преобразование типов
- 12.1. Автоматизированная проверка безопасности
- 12.3. Проверка конфигурации
- Проверка, что сервер Firebird запущен