
- •220300 - Системы автоматизированного проектирования
- •Состав языка и принцип работы компилятора языка высокого уровня
- •Идентификаторы
- •Альтернативный ввод-вывод в стиле с
- •Константы
- •Манипуляторы
- •Преобразования типов
- •Арифметические операции
- •Функции стандартной библиотеки
- •Операции отношения и логические операции
- •Базовые конструкции структурного программирования
- •Цикл с параметром (for)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Рекомендации по программированию циклов
- •Ветвления
- •Условный оператор if
- •Вложенные конструкции
- •Проблемы соответствия if и else во вложенных ветвлениях
- •Условная операция
- •Оператор switch
- •Операторы передачи управления
- •Контрольная работа
- •Массивы
- •Сортировка массива методом выбора
- •Сортировка массива методом пузырька
- •Многомерные массивы
- •Операции со строками
- •Функции
- •Void starline(); // объявление функции (прототип)
- •Передача аргументов в функцию по значению
- •Void charline(char sim, int n); // объявление функции (прототип)
- •Возвращение функцией значения
- •Передача аргументов по ссылке
- •Возвращение значения по ссылке
- •Перегруженные функции
- •Переменные и функции
- •Передача массивов в функции
- •Указатели
- •Указатели и массивы
- •Указатели и функции
- •Указатели и строки
- •Динамический массив и динамическое выделение памяти
- •Ввод/вывод
- •Форматированный ввод/вывод
- •Конструкторы и методы
- •Двоичный ввод/вывод. Бинарные файлы
- •Двунаправленный ввод/вывод
- •Функции стандартной библиотеки для работы с файлами или ввод/вывод в стиле с
Операции со строками
При использовании строкового типа char операция присваивания одной строки другой не определена, поскольку строка является массивом. Она может выполняться с помощью цикла или функций стандартной библиотеки.
Рассмотрим пример написания программы, которая с помощью цикла позволяет скопировать одну строку в другую:
#include <iostream.h>
#include <string.h>
#include <conio.h>
using namespace std;
int main() {
const int MAX = 80; // максимальная длина строки_2
char str1[ ] = "Privet, Mir!"; // исходная строка 1
char str2[MAX]; // строка 2
int j;
for(j = 0; j < strlen(str1); j++) // копируем strlen ( str1 ), т.е. 12 символов
str2[j] = str1[j]; // символов из str1 в str2
str2[j] = '\0'; //заверш. строку 0 (эту строку можно не писать, заменив нач. цикла на for(j = 0; j <= strlen(str1); j++))
cout << str2 << endl; // и выводим str2 на экран, увидим: Privet, Mir!
getch(); return 0;
}
Функция strlen(str1) определяет длину 1-ой строки.
А теперь продемонстрируем копирование строк более простым способом, применив функцию стандартной библиотеки:
#include <string.h>
…
int main() {
const int MAX = 80; // максимальная длина строки 2
char str1[ ] = "Privet, Mir!"; // исходная строка 1
char str2[MAX]; // строка 2
strcpy(str2, str1); // str2 = str1
cout << str2 << endl; // выводим str2 на экран, увидим: Privet, Mir!
getch(); return 0;
}
Здесь нами используется функция strcpy(str2, str1);, которая копирует строку str1 в str2. Порядок записи аргументов этой функции, справа налево, напоминает формат обыкновенного присваивания: переменная справа копируется в переменную слева.
Рассмотрим ещё один пример раскрывающий суть работы со строками.
… #include <string.h> using namespace std; int main() { char str1[6] = "Vasia"; char str2[3] = "Ok"; for(int j=0; j<strlen(str2); j++) { str1[j] = str2[j]; } cout << str1 << endl; cout << strlen(str1); getch(); return 0; }
|
… #include <string.h> using namespace std; int main() { char str1[6] = "Vasia"; char str2[3] = "Ok"; for(int j=0; j<=strlen(str2); j++) { str1[j] = str2[j]; } cout << str1 << endl; cout << strlen(str1); getch(); return 0; }
|
Увидим: Oksia 5
|
Увидим: Ok 2
|
Вообще, в С++ нет встроенных операторов для работы со строками типа char. Поэтому необходимо использовать библиотечные функции. Библиотека включает множество функций для операций со строками и предоставляет возможности копирования, сравнения, объединения строк, поиска подстроки, определения длины строки и т.д., а также содержит специальные функции ввода строк и отдельных символов с клавиатуры и из файла. Для использования библиотечных функций для строк нужно подключить заголовочный файл cstring или string.h.
Рассмотрим наиболее часто употребляемые функции для char-строк:
strcpy(s1, s2) – функция копирует s2 в s1 и возвращает s1;
strncpy(s1, s2, n) – копирует не более n символов из s2 в s1 и возвращает s1;
strcmp(s1, s2) – сравнивает строки и возвращает отрицательное значение типа int (если s1 < s2), нулевое (если s1 = s2) или положительное (если s1 > s2);
strncmp(s1, s2, n) – сравнивает s1 и первые n символов строки s2 и возвращает отрицательное значение (если s1 < s2), нулевое (если s1 = s2) или положительное (если s1 > s2);
strcat(s1, s2) – добавляет s2 к s1 и возвращает s1;
strncat(s1, s2, n) – добавляет не более n символов из s2 к s1 и возвращает s1;
strstr(s1, s2) – ищет подстроку s2 в s1 (в случае неудачи возвращает NULL);
strchr(s, ch) – ищет символ ch в строке s (в случае неудачи возвращает NULL);
strpbrk(s1, s2) – ищет наличие любого из символов строки s2 в s1;
strlen(s) – возвращает длину строки (без учёта символа завершения строки).
В библиотеке определён ещё целый ряд функций, проверяющих принадлежность символа какому-либо множеству букв (isalfa), разделителей (isspace), знаков пунктуации (ispunct), цифр (isdigit) и т.д. Существуют функции для преобразования строки в целое число (atoi(str)), в вещественное (atof(str)).
Д/З |
Напишите две версии программы, которая запрашивает у пользователя семизначный пароль не более трёх раз и в зависимости от результата выводит на экран: "Пароль принят" или "Пароль не принят". Для ввода строки не допускается использование метода get(), следует использовать cin >>. В случае, когда пользователь вводит более 7 знаков программа должна выдавать сообщение об ошибке и закрываться. Первую версию программы необходимо реализовать с использованием библиотечных функций для строк, а вторую – без их использования (разрешается strlen). По второй версии дай контрольную работу. |
Ответ |
int main() { const int MAX = 8; char passw[ ] = "student"; // пароль char str[MAX]; // строка-пароль, кот. вводит пользователь int p=0; do { cout << "\nVvedite parol (max 7 znakov): "; cin >> str; if(strlen(str)>MAX) { cout << "Error: Kol-vo znakov > 7 !"; break; } if(strstr(str, passw) != NULL) { cout << "Parol prinyat!"; break; } else { cout << "Parol NE prinyat!"; p++; } }while(p<3); getch(); return 0; } 2 вар.--------------------------------------------------------------------------- int main() { const int MAX = 8; char passw[ ] = "student"; // пароль char str[MAX]; // строка-пароль, кот. вводит пользователь int p=0, i, j, da, net=0; while(p<3) { da=0; j=0; cout << "Vvedite parol (7 zn.): "; cin >> str; if(strlen(str)>MAX) { cout << "ERROR: Kol. znakov > 7!" << endl; continue; } for(i=0; i<MAX-1; i++) { if(str[i] == passw[j]) { j++; da++; } else net++; } if(da == 7) break; else p++; } if(da==7) cout << "Parol prinyat!"; if(net>0 && da<7) cout << "Otkazano v dostupe!"; getch(); return 0; } |
Лекция 6 (10.5 стр.)