Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по Программированию на С++.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
795.65 Кб
Скачать

Операции со строками

При использовании строкового типа 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 стр.)