Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 25.11.2008 | Доступ: свободный | Студентов: 9593 / 1296 | Оценка: 4.06 / 3.66 | Длительность: 21:16:00
Лекция 5:

Системные данные текстового типа

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

4.5. Операции над текстовыми данными

4.5.1. Операции над символьными данными

Значения символьных данных эквивалентны однобайтовым целым числам. Поэтому им можно присваивать целочисленные значения, равные соответствующим кодам таблицы ASCII, сравнивать на принадлежность тем или иным интервалам. Подобного рода операции упрощаются, если прибегнуть к группе специальных функций, прототипы которых сосредоточены в файле ctype.h. Все эти функции организованы по единому шаблону – их единственным аргументом является числовой код анализируемого символа. Возвращаемое каждой функцией значение либо равно 0, если соответствующая проверка дала отрицательный результат, либо отлично от нуля в случае истинности проверяемого условия. Перечень этих функций приведен в табл. 4.1.

Таблица 4.1.
Функция Проверяемое условие
isalnum(ch) Является ли ch цифрой или буквой латинского алфавита
isalpha(ch) Является ли ch буквой латинского алфавита
isascii(ch) Принадлежит ли ch первой половине таблицы ASCII
iscntrl(ch) Принадлежит ли ch группе управляющих символов ( ch<0x20 )
isdigit(ch) Является ли ch цифрой
isgraph(ch) Является ли ch отображаемым символом ( 0x21<=ch<=0x7E )
islower(ch) Является ли ch малой буквой латинского алфавита
isprint(ch) Является ли ch отображаемым символом (0x20 \le ch \le 0x7E)
ispunct(ch) Является ли ch символом-разделителем ( iscntrl || isspace )
isspace(ch) Является ли ch обобщенным пробелом ( 0x20, 0x09,0x0A,0x0D )
isupper(ch) Является ли ch большой буквой латинского алфавита
isxdigit(ch) Является ли ch шестнадцатеричной цифрой

В раздел type.h включены еще три функции преобразования аргумента ch. Результатом преобразования является возвращаемое значение функции:

  • toascii(ch) – возвращает код, образованный 7 младшими битами ch;
  • tolower(ch) – возвращает код строчной буквы, если ch является кодом заглавной буквы;
  • toupper(ch) – возвращает код заглавной буквы, если ch является кодом строчной буквы.

4.5.2. Операции над строковыми данными

Для обработки строк, представленных одномерными символьными массивами, в библиотеке системных функций предусмотрено довольно много различных операций. Прототипы этих функций сгруппированы в заголовочном файле string.h и большинство их названий начинается с префикса str (от string ). Условимся о некоторых обозначениях аргументов и их типах, чтобы не повторять их в приведенной таблице:

  • S, S1,S2 – указатель на символьный массив (как правило, имя массива);
  • CS – указатель типа const char * (т.е. неизменяемый массив или строковая константа – источник данных);
  • ch – код символа, обычно числовое значение типа int ;
  • k – количество символов.
Таблица 4.2.
Функция Выполняемое действие
Определение длины строки
strlen(CS) Возвращает количество символов в строке S
Формирование строк
strdup(CS) Запрашивает память, копирует туда содержимое CS и возвращает указатель типа char* на новую строку
strcpy(S1,CS2) Копирует содержимое CS2 в S1, возвращает указатель на S1
strncpy(S1,CS2,k) Копирует первые k символов из CS2 в S1, возвращает указатель на S1
stpcpy(S1,CS2) Копирует CS2 в S1, возвращает указатель на конец S1
strset(S,ch) Расписывает строку S символом ch, возвращает указатель на S
strnset(S,ch,k) Повторяет k раз символ ch в строке S, возвращает указатель на S1
Конкатенация строк
strcat(S1,CS2) Приписывает содержимое CS2 в конец S1, возвращает указатель на S1 (длина массива S1 должна предусматривать такое расширение)
strncat(S1,CS2,k) Присоединяет первые k символов CS2 к содержимому S1, возвращает указатель на S1
Смена регистра
strlwr(S) замена символов строки S кодами малых букв, действует только на буквы латинского алфавита
strupr(S) замена символов строки S кодами больших букв, действует только на буквы латинского алфавита
Переворот строки
strrev(S) Перестановка символов строки S в обратном порядке
Преобразование в числовые данные
strtol(CS,ptr,r) Число, представленное в символьном виде в CS и записанное в системе счисления с основанием r, преобразуется в машинный формат числа типа long. В указатель ptr заносится адрес символа, прервавшего преобразования. Возвращаемое значение – результат преобразования.
strtoul(CS,ptr,r) Аналогичное преобразование в длинное целое число без знака
strtod(CS,ptr) Преобразование вещественного числа из символьного представления в машинный формат числа типа double.
Сравнение строк
strcmp(CS1,CS2) Возвращаемое значение равно 0, если CS1=CS2, больше 0, если CS1>CS2, и меньше 0, если CS1<CS2
strncmp(CS1,CS2,k) Сравниваются только первые k символов строк CS1 и CS2
stricmp(CS1,CS2) При сравнении игнорируется разница между кодами больших и малых букв
strcmpi(CS1,CS2) Аналогичная операция, разница только в названии функций
strnicmp(CS1,CS2,k) Сравнение первых k символов с игнорированием разницы между кодами больших и малых букв
strncmpi(CS1,CS2,k) Аналогичная операция, разница только в названии функций
Поиск символа
strchr(CS,ch) Строка CS сканируется слева направо до обнаружения символа ch. Если он найден, возвращаемый указатель "смотрит" на этот символ в строке CS, если такого символа нет, то возвращаемый указатель равен null (т.е. 0)
strrchr(CS,ch) Аналогичный поиск с конца строки CS.
Поиск строки
strstr(CS1,CS2) Поиск первого вхождения строки CS2 в строку CS1. Если поиск завершен успешно, возвращается указатель на первый символ найденной подстроки. В противном случае возвращается null
Специальный поиск
strpbrk(CS1,CS2) В строке CS1 ищется первый символ, содержащийся в CS2. Возвращается указатель на найденный символ или null.
strspn(CS1,CS2) Определяется длина начального фрагмента CS1, целиком состоящая из символов CS2 (порядок символов роли не играет)
strcspn(CS1,CS2) Определяется длина начального фрагмента CS1, который не содержит ни одного символа из CS2
strtok(S1,CS2) Поиск в строке S1 лексем, разделенных символами CS2

Некоторые из функций, приведенные в табл. 4.2, нуждаются в дополнительных пояснениях.

В функциях strtol и strtoul, выполняющих преобразование символьного представления числа в соответствующий машинный формат, допускается задание r=0. В этом случае основание системы определяется символьной записью числа. Если строка начинается с символа '0', за которым следуют символы цифр, не превосходящих 7, то число считается восьмеричным. Если строка начинается с комбинации '0x' или '0X', вслед за которой располагаются шестнадцатеричные цифры, то считается, что r=16.

В функции strtok лексемой считается цепочка символов, завершающаяся одним из предусмотренных символов-разделителей. При первом обращении к этой функции в строке S1 находится начальная лексема и возвращаемое значение является указателем на ее начальный символ. Одновременно в строку S1 на место обнаруженного символа-разделителя заносится нулевой байт. Это позволит в дальнейшем работать с найденной лексемой как со строкой. Для поиска следующих лексем в повторных обращениях к функции strtok вместо первого аргумента нужно задавать нулевой аргумент. Функция будет искать следующую лексему, расположенную правее принудительно вставленного нулевого байта. И так можно последовательно обнаружить все лексемы, содержавшиеся в строке S1. Для пояснения приведем следующий пример:

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{ char *ptr;
  ptr=strtok("FEB.14,2006",".,-/");
  while(ptr!=NULL)
  { printf("ptr=%s\n",ptr);
    ptr=strtok(NULL, ".,-/");
  }
  getch();
}
//=== Результат работы ===
ptr=FEB
ptr=14
ptr=2006
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Alexey Ku
Alexey Ku

Попробуйте часть кода до слова main заменить на 

#include "stdafx.h" //1

#include <iostream> //2
#include <conio.h>

using namespace std; //3

Александр Талеев
Александр Талеев

#include <iostream.h>
#include <conio.h>
int main(void)
{
int a,b,max;
cout << "a=5";
cin >> a;
cout <<"b=3";
cin >> b;
if(a>b) max=a;
else max=b;
cout <<" max="<<max;
getch();
return 0;
}

при запуске в visual express выдает ошибки 

Ошибка    1    error C1083: Не удается открыть файл включение: iostream.h: No such file or directory    c:\users\саня\documents\visual studio 2012\projects\проект3\проект3\исходный код.cpp    1    1    Проект3

    2    IntelliSense: не удается открыть источник файл "iostream.h"    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    1    1    Проект3

    3    IntelliSense: идентификатор "cout" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    6    1    Проект3

    4    IntelliSense: идентификатор "cin" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    7    1    Проект3

при создании файла я выбрал пустой проект. Может нужно было выбрать консольное приложение?