Книга: Язык Си - руководство для начинающих

ПРОВЕРКА И ПРЕОБРАЗОВАНИЕ СИМВОЛОВ

ПРОВЕРКА И ПРЕОБРАЗОВАНИЕ СИМВОЛОВ

     Заголовочный файл 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 предоставляют удобные и полезные средства для программирования. Теперь давайте займемся некоторыми более сложными функциями преобразования.

Оглавление книги


Генерация: 1.381. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз