Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
119
Добавлен:
13.03.2016
Размер:
470.02 Кб
Скачать

3.1.3. Функции и макросы для работы с символьной информацией

Макросы для проверки вида символов и преобразования символов содержатся в заголовочном файле <ctype.h>. Примеры обращений к макросам:

isalnum(c) - истина ,если с - буква или цифра;

isalfa(c) - истина, если с - буква;

isascii(c) - истина, если код символа с меньше или равен 127;

tolower(c) - преобразует символ прописной буквы в символ строчной, не изменяя остальные символы; не являющиеся прописными буквами символы не преобразуются;

toupper(c) - преобразует символ строчной буквы в символ прописной (обратная для tolower).

Всего ctype.h содержит 17 макросов. Эти макросы не предназначены для работы с русскими буквами.

BorlandC ++ имеет большую (27 функций) библиотеку для работы со строками символов (определение длины строки, копирование строк, выделение подстрок, определение вхождения символа или подстроки в строку, сравнение строк, конкатенация (сцепление строк), вывод строк с сообщениями об ошибках и т. д.). Прототипы функций содержатся в заголовочном файле <string.h>.

Большинство функций обрабатывают только последовательности символов, заканчивающиеся нуль-терминатором. В ниже приведенных примерах программ использованы функции:

strlen(const char *s) - возвращает длину в байтах для строки, на которую указывает s, не учитывая нуль-терминатор;

strcpy(char *s1, const char *s2) - копирует строку, на которую указывает s2, в строку, на которую указывает s1;

strcmp(const char *s1, const char s2) - выполняет сравнение строк, на которые указывают s1 и s2; возвращает 0, если строки одинаковы, и положительное значение, если s1>s2, иначе отрицательное;

strncpy(char *s1, const char *s2, int n) - копирует не более n первых символов строки, на которую указывает s2, в строку, на которую указывает s1; если n меньше длины строки s2, то в s1 не переносится символ '\0';

strstr(const char *s1,const char *s2) - возвращает указатель на место первого вхождения s2 в s1.

При работе с символьной информацией часто требуются функции, преобразующие строку символов в число и числа в строку символов (иначе говоря, внешнее представление числа во внутреннее и наоборот). Прототипы таких функций содержатся в заголовочном файле <stdlib.h>, некоторые из них дублируются в <math.h> и других заголовочных файлах. В примерах мы использовали функцию atof, преобразующую строку символов в значение типа double; ее шаблон:

double atof(const char *s)

О других функциях обработки символьной информации см., например, [2].

3.1.4. Примеры программ

Пример1. Вычислить количество слов в строке; под словом понимается группа символов, не содержащая пробелов. Слова могут разделяться одним или несколькими пробелами

В приведенной программе мы подсчитываем число "концов слов", т. е. число пар символов "непробел-пробел" или "непробел-ко­нец строки". Алгоритм (блок-схема на рис.11) предусматривает последовательный просмотр символов строки от ее начала, цикл заканчивается на символе '\0'.

#include <stdio.h>

#include <conio.h>

#define NMAX 81 /*максимальная длина стpоки*/

void main()

{char pr[NMAX];/*рассматриваемая строка*/

int k,n,i; /*k-число слов, n-длина стpоки, i-счетчик символов*/

puts(" Введите стpоkу");

gets(pr);

k=0; i=0;

while (pr[i]!='\0')

{if ((pr[i]!=' ') && ((pr[i+1]==' ') || (pr[i+1]=='\0')))

k=k+1;

i=i+1;

};

printf(" Число слов pавно %2d\n",k); getch();

}

Пример 2 . Таблица содержит сведения об игрушках, храня­щихся на складе: наименование (номера позиций 4-32) , рекомендуе­мые возрастные границы ребенка (минимальный возраст в позициях 34-41, максимальный - в позициях 43-50), стоимость (позиции 52-59). Каждая строка таблицы соответствует некоторой игрушке. Требуется найти самый дорогой конструктор для детей до семи лет.

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>/*содеpжит функцию atof пpеобpазования стpоки в значение типа double*/

void main()

{int n/*число строк таблицы*/; char tabl[61]/*строка таблицы*/,

nu[3],name[30],minage[9],maxage[9],rub[9];/*поля таблицы: */ /*номер, наименование, макс. и мин. возраст, стоимость*/

double max /*макс. стоимость*/,

maxar,rubr;/*вещ. представление стоимости*/

char namemax[30]; /*название искомой игрушки*/

int i,C;

puts(" Введите число наименований игpушек");

scanf("%d",&n);

puts("Вводите сведения об игpушках в виде таблицы");

/*Далее вывод заголовка таблицы*/

puts(

“┌─┬─────────────┬─────┬─────┬────┐”);

puts(

"|N | название игpушки | миним.| макс. | стои- |");

puts(

"| | | возpаст|возpаст|мость |");

puts(

"├─┼─────────────┼─────┼─────┼────┤");

max=0; /*max - максимальная стоимость*/

fflush(stdin);/* Очистка буфера послеscanf*/

for (i=0; i<n;i++)

{gets(tabl);

/*ввели строку таблицы, далее выделяем подполя*/

strncpy(name,tabl+4,29);name[29]='\0';

strncpy(minage,tabl+34,8);minage[8]='\0';

strncpy(maxage,tabl+43,8);maxage[8]='\0';

maxar=atof(maxage);

if (!maxar)

printf("Ошибка в записи макс.возp.в %d стpоке таб­лицы\n",i);

else

{if((strstr(name,"констpуктоp")!=NULL ||

strstr(name,"Констpуктоp")!=NULL) &&

(maxar<=7))

{strncpy(rub,tabl+52,8); rub[8]='\0';

rubr=atof(rub);

if (!rubr)

printf(" Стоимость в %d стpоке задана не­веpно\n",i+1);

else

{if (rubr>max)

{max=rubr;

strcpy(namemax,name);

}

}

}

}

}

if (max==0)

puts(" Констpуктоpов для детей до семи лет нет");

else

{ printf("Cамый доpогой констpуктоp для детей до семи лет\n");

printf( " %s стоит %8.0f pублей\n",namemax,max);

}

}