Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка С.doc
Скачиваний:
13
Добавлен:
12.11.2019
Размер:
1.94 Mб
Скачать

7.4 Строки

Строка представляет собой массив символов, заканчивающийся нуль-символом. Нуль-символ - это символ с кодом, равным 0, что записывается в виде управляющей последовательности '\0'. По положению нуль-символа определяется фактическая длина строки. Строку можно инициализировать строковым литералом:

char str[10] = "Vasia";

// выделено 10 элементов с номерами от 0 до 9

// первые элементы - 'V', 'a', 's', 'i', 'а', '\0'

В этом примере под строку выделяется 10 байт, 5 из которых занято под символы строки, а шестой - под нуль-символ. Если строка при определении инициализируется, ее размерность можно опускать (компилятор сам выделит соответствующее количество байт):

char str[] = "Vasia"; // выделено и заполнено 6 байт

Оператор

char *str = "Vasia"

создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно (к примеру, оператор str[1]='o' не допускается). Знак равенства перед строковым литералом означает инициализацию, а не присваивание. Операция присваивания одной строки другой не определена (поскольку строка является массивом) и может выполняться с помощью цикла или функций стандартной библиотеки.

Пример. Программа запрашивает пароль не более трех раз.

#include <stdio.h>

#include <string.h>

int main(){

char s[80], passw[] = "kuku"; // passw - эталонный пароль.

// Можно описать как *passw = "kuku";

int i, k = 0;

for (i = 0; !k && i<3; i++){

printf("\nвведите пароль:\n");

gets(s); // функция ввода строки

if (strstr(s,passw)) k = 1; // функция сравнения строк

}

if (k) printf("\nпароль принят");

else printf("\nпароль не принят");

return 0;

}

Распространенные ошибки при работе со строками - отсутствие нуль-символа и выход указателя при просмотре строки за ее пределы.

При работе со строками удобно пользоваться функциями стандартной библиотеки C или определенным в С++ классом string, который обеспечивает индексацию, присваивание, сравнение, добавление, объединение строк и поиск подстрок, а также преобразование из С-строк, то есть массивов типа char, в string, и наоборот.

7.4.1 Функции стандартной библиотеки

Полный список функций заголовочного файла <string.h> приведен в таблице 8.

Более подробно о каждой функции, а также список аргументов можно посмотреть в справке.

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

double atof(const char* p) - преобразует переданную строку в double;

int atoi (const char* p) - преобразует переданную строку в int;

long atol (const char* p) - преобразует переданную строку в long.

Пробелы и табуляции в начале строки пропускаются. Преобразование прекращается при встрече недопустимого символа или конца строки. Если строку нельзя преобразовать в число, возвращается 0. Если число выходит за пределы диапазона данного типа, переменной errno (заголовочный файл <cerrno>) присваивается значение ERANGE и возвращается допустимое число.

Таблица 8 - Заголовочный файл <string.h> (<cstring>) - функции работы со строками в стиле С

Имя функции

Выполняемое действие

memchr

Ищет первое вхождение символа в блок памяти

memcmp

Сравнивает блоки памяти

memcpy

Копирует блок памяти

memmove

Переносит блок памяти

memset

Заполняет блок памяти символом

strcat

Складывает строки

strchr

Ищет символ в строке

strcmp

Сравнивает строки

strcoll

Сравнивает строки с учетом установленной локализации

strcpy

Копирует одну строку в другую

strcspn

Ищет один из символов одной строки в другой

strerror

Возвращает указатель на строку с описанием ошибки

strlen

Возвращает длину строки

strncat

Складывает одну строку с n символами другой

strncmp

Сравнивает одну строку с n символами другой

strncpy

Копирует первые n символов одной строки в другую

strpbrk

Ищет один из символов одной строки в другой

strrchr

Ищет символ в строке

strspn

Ищет символ одной строки, отсутствующий в другой

strstr

Ищет подстроку в строке

strtok

Выделяет из строки лексемы

strxfrm

Преобразует строки на основе текущей локализации

wcscat

Складывает строки

wcschr

Ищет символ в строке

wcscmp

Сравнивает строки

wcscol1

Сравнивает строки с учетом установленной локализации

wcscpy

Копирует одну строку в другую

wcscspn

Ищет один из символов одной строки в другой

wcslen

Возвращает длину строки

wcsncat

Складывает одну строку с n символами другой

wcsncmp

Сравнивает одну строку с n символами другой

wcsricpy

Копирует первые n символов одной строки в другую

wcspbrk

Ищет один из символов одной строки в другой

wcsrchr

Ищет символ в строке

wcsspn

Ищет символ одной строки, отсутствующий в другой

wcsstr

Ищет подстроку в строке

wcstok

Выделяет из строки лексемы

wcstrxfrm

Преобразует строки на основе текущей локализации

wmemcpy

Копирует блок памяти

wmemmove

Переносит блок памяти

wmemset

Заполняет блок памяти символом

Пример (программа заполняет массив типа double из строки):

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main(){

char s[] = "2, 38.5, 70, 0, 0, 1", *p = s;

double m[10];

int i = 0;

do{

m[i++] = atof(p);

if (i>9) break;

}while(p = strchr(p, ','), p++);

for( int k = 0; k<i; k++) printf("%5.2f ", m[k]);

return 0;

}

В стандартной библиотеке имеются также функции и работы с символами (заголовочные файлы <ctype.h> и <cctype>), приведенные в таблице 9.

Таблица 9 – Функции работы со строками заголовочных файлов <ctype.h> и <cctype>

Имя функции

Проверка на принадлежность символа множеству:

isalnum

букв и цифр (A-Z, a-z, 0-9)

isalfa

букв (A-Z, a-z)

iscntrl

управляющих символов (с кодами 0..31 и 127)

isdigit

цифр (0-9)

isgraph

печатаемых символов, кроме пробела (isalfa | isdigit | ispunct)

islower

букв нижнего регистра (a-z)

isprint

печатаемых символов

ispunct

знаков пунктуации

isspace

символов-разделителей

isupper

букв верхнего регистра (A-Z)

isxdigit

шестнадцатеричных цифр (A-F, a-f, 0-9)

Функции принимают величину типа int и возвращают значение true, если условие выполняется. Рекомендуется пользоваться стандартными функциями, а не писать собственные циклы проверки, так как это снижает количество ошибок в программе.

Кроме описанных выше, в библиотеке есть функции tolower и toupper, переводящие символ латинского алфавита соответственно в нижний и верхний регистр.

Для каждой из перечисленных функций есть ее аналог для многобайтных символов типа wchar_t, содержащий в названии букву w.