![](/user_photo/2706_HbeT2.jpg)
- •Красноярск
- •Федеральное агентство по образованию гоу впо «Сибирский государственный технологический университет»
- •220301 Автоматизация технологических процессов и производств,
- •230201 Информационные системы и технологии,
- •230105 Программное обеспечение вычислительной техники и автоматизированных систем всех форм обучения Красноярск
- •Содержание
- •Введение
- •1 Состав языка
- •1.1 Алфавит языка
- •1.2 Идентификаторы
- •1.3 Ключевые слова
- •1.4 Знаки операций
- •1.5 Константы
- •1.6 Комментарии
- •2.1 Концепция типа данных
- •2.2 Основные типы данных
- •3 Структура программы
- •4 Ввод/вывод
- •5 Переменные и выражения
- •5.1 Переменные
- •5.2 Операции
- •5.3 Выражения
- •6 Базовые конструкции структурного программирования
- •6.1 Оператор «выражение»
- •6.1.1 Задачи для решения на тему «линейные алгоритмы»
- •6.2 Операторы ветвления
- •6.2.1 Условный оператор if
- •6.2.2 Оператор switch
- •6.2.3 Задачи для решения на тему «условные алгоритмы»
- •6.3 Операторы цикла
- •6.3.1 Цикл с предусловием (while)
- •6.3.2 Цикл с постусловием (do while)
- •6.3.3 Цикл с параметром (for)
- •6.3.4 Задачи для решения на тему «сочетание цикла и разветвления»
- •6.4 Операторы передачи управления
- •6.4.1 Оператор goto
- •6.4.2 Оператор break
- •6.4.3 Оператор continue
- •6.4.4 Оператор return
- •6.4.5 Задачи для решения на тему «вложенные циклы (вычисление суммы ряда)»
- •7 Указатели и массивы
- •7.1 Указатели
- •7.1.1 Инициализация указателей
- •7.1.2 Операции с указателями
- •7.2 Ссылки
- •7.3 Массивы
- •7.3.1 Задачи для решения на тему «одномерные массивы»
- •7.3.2 Задачи для решения на тему «двумерные массивы»
- •7.4 Строки
- •7.4.1 Функции стандартной библиотеки
- •7.4.2 Задачи для решения на тему «строки»
- •8.1 Переименование типов (typedef)
- •8.2 Перечисления (enum)
- •8.3 Структуры (struct)
- •8.4 Битовые поля
- •8.5 Задачи для решения на тему «структуры»
- •9 Функции
- •9.1 Объявление и определение функций
- •9.2 Глобальные переменные
- •9.3 Возвращаемое значение
- •9.4 Параметры функции
- •9.5 Передача массивов в качестве параметров
- •9.6 Параметры со значениями по умолчанию
- •9.7 Функции с переменным числом параметров
- •9.8 Рекурсивные функции
- •9.9 Задачи для решения на тему «функции»
- •10 Директивы препроцессора
- •10.1 Директива #include
- •10.2 Директива #define
- •11 Динамические структуры данных
- •11.1 Линейные списки
- •11.2 Стеки
- •11.3 Очереди
- •11.4 Бинарные деревья
- •11.5 Задачи на тему «динамические структуры»
- •Задание на курсовую работу
- •Библиографический список
- •660049, Красноярск, пр. Мира, 82
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.