- •Министерство образования и науки российской федерации
- •Оглавление
- •Введение
- •Практическая работа № 1 Вычисление выражений с использованием стандартных функций
- •2. Постановка задачи
- •3. Варианты
- •4. Методические указания
- •Практическая работа №2
- •4. Методические указания
- •Практическая работа №3 Работа с одномерными массивами
- •1. Краткие теоретические сведения
- •2. Постановка задачи
- •3. Варианты
- •4. Методические указания
- •5. Содержание отчета:
- •Практическая работа №4 Сортировка массивов методом пузырька
- •3 . Методические указания
- •4. Содержание отчета:
- •Практическая работа № 6 Сортировка массивов методом Шелла
- •4. Содержание отчета:
- •5.Контрольные вопросы:
- •Практическая работа №7 Динамические массивы
- •2. Постановка задачи
- •3. Варианты
- •4. Методические указания
- •5. Содержание отчета
- •3. Варианты
- •4. Методические указания
- •6. Контрольные вопросы:
- •Практическая работа № 9
- •2. Постановка задачи
- •3. Варианты
- •6. Контрольные вопросы:
- •Практическая работа №10 Динамические структуры данных
- •2. Постановка задачи
- •3. Варианты
- •5. Содержание отчета
- •Практическая работа №11 Хранение данных на внешних носителях информации
- •1. Краткие теоретические сведения
- •2. Постановка задачи
- •3. Варианты:
- •6. Контрольные вопросы:
- •Практическая работа № 12 Функции для работы со строками.
- •5. Контрольные вопросы:
- •Литература:
6. Контрольные вопросы:
1. Что такое поток?
2. Какие уровни ввода-вывода поддерживает библиотека С?
3. Какие режимы открытия файлов вам известны?
4. Какие операции можно производить с потоком?
5. Какие виды потоков вам известны?
6. Какими командами производится открытие и закрытие файлов?
7. Что такое форматированный ввод/вывод?
Практическая работа № 12 Функции для работы со строками.
Цель работы: научиться использовать операторы для работы со строками.
Теоретические сведения.
Функции для работы со строками.
Символ – элементарная единица, некоторый набор которых несет определенный смысл. В языке программирования С++ предусмотрено использование символьных констант. Символьная константа – это целочисленное значение (типа int) представленное в виде символа, заключённого в одинарные кавычки, например 'a'. В таблице ASCII представлены символы и их целочисленные значения.
1 2 3 4 |
// объявления символьной переменной char symbol = 'a'; // где symbol – имя переменной типа char // char – тип данных для хранения символов |
Строки в С++ представляются как массивы элементов типа char, заканчивающиеся нуль-терминатором \0 называются С строками или строками в стиле С.
\0 — символ нуль-терминатора.
Символьные строки состоят из набора символьных констант заключённых в двойные кавычки. При объявлении строкового массива необходимо учитывать наличие в конце строки нуль-терминатора, и отводить дополнительный байт под него.
1 2 3 4 |
// пример объявления строки char string[10]; // где string – имя строковой переменной // 10 – размер массива, то есть в данной строке может поместиться 9 символов , последнее место отводится под нуль-терминатор. |
Строка при объявлении может быть инициализирована начальным значением, например, так:
1 |
char string[10] = "abcdefghf"; |
Если подсчитать кол-во символов в двойных кавычках после символа равно их окажется 9, а размер строки 10 символов, последнее место отводится под нуль–терминатор, причём компилятор сам добавит его в конец строки.
Таблица 1 — Функции для работы со строками и символами | |
Функция |
Пояснение |
strlen(имя_строки) |
определяет длину указанной строки, без учёта нуль-символа |
Копирование строк | |
strcpy(s1,s2) |
выполняет побайтное копирование символов из строки s2 в строку s1 |
strncpy(s1,s2, n) |
выполняет побайтное копирование n символов из строки s2 в строку s1. возвращает значения s1 |
Конкатенация строк | |
strcat(s1,s2) |
объединяет строку s2 со строкой s1. Результат сохраняется в s1 |
strncat(s1,s2,n) |
объединяет n символов строки s2 со строкой s1. Результат сохраняется в s1 |
Сравнение строк | |
strcmp(s1,s2) |
сравнивает строку s1 со строкой s2 и возвращает результат типа int: 0 –если строки эквивалентны, >0 – если s1<s2, <0 — если s1>s2 С учётом регистра |
strncmp(s1,s2) |
сравнивает n символов строки s1 со строкой s2 и возвращает результат типа int: 0 –если строки эквивалентны, >0 – если s1<s2, <0 — если s1>s2 С учётом регистра |
stricmp(s1,s2) |
сравнивает строку s1 со строкой s2 и возвращает результат типа int: 0 –если строки эквивалентны, >0 – если s1<s2, <0 — если s1>s2 Без учёта регистра |
strnicmp(s1,s2) |
сравнивает n символов строки s1 со строкой s2 и возвращает результат типа int: 0 –если строки эквивалентны, >0 – если s1<s2, <0 — если s1>s2 Без учёта регистра |
Конкатенация строк
Конкатенация двух строк означает их сцепление, при этом создается новая, более длинная строка. При объявлении строки
char original[128] = "Test ";
оператор
strcat(original, " one, two, three!");
превратит значение первоначальной строки original в "Test one, two, three!"
При вызове функции strcat() убедитесь, что первый аргумент типа char * инициализирован и имеет достаточно места, чтобы запомнить результат. Если c1 адресует строку, которая уже заполнена, а c2 адресует ненулевую строку, оператор strcat(c1, c2); перезапишет конец строки, вызвав серьезную ошибку.
Функция strcat() возвращает адрес результирующей строки (совпадающий с ее первым параметром) и может использоваться как каскад нескольких вызовов функций:
strcat(strcat(c1,c2),c3)
Следующий пример показывает, как можно использовать функцию strcat() для получения в одной строке фамилии, имени и отчества, хранящихся отдельно, например, в виде полей базы данных. Введите фамилию, имя и отчество. Программа сцепит введенные вами строки и отобразит их как отдельную строку.
#include <iostream>
#include <string.h>
using namespace std;
void main()
{
//Резервирование места для ввода трех строк.
char *fam = new char[128];
char *im = new char[128];
char *otch = new char[128];
//Ввод данных.
cout << "Enter" << "\n";
cout << "\tSurname: ";
cin >> fam;
cout << "\tName: ";
cin >> im;
cout << "\tLastname: ";
cin >> otch;
//Резервирование места для результата.
//Нужно учесть два пробела и результирующий
//нулевой символ.
char *rez=new char[strlen(fam)+strlen(im)+strlen(otch)+3];
//"Сборка" результата.
strcat(strcat(strcpy(rez,fam)," "),im);
strcat(strcat(rez," "),otch);
//Возврат памяти в кучу.
delete [] fam;
delete [] im;
delete [] otch;
//Вывод результата.
cout << "\nResult: " << rez;
delete [] rez;
}
Копирование строк
1 2 3 4 5 6 7 8 10 11 12 13 |
// str_cpy.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h" #include <iostream> using namespace std;
int main(int argc, char* argv[]) { char s2[27] = "Counter-Strike 1.6 forever"; // инициализация строки s2 char s1[27]; // резервируем строку для функции strcpy() cout << "strcpy(s1,s2) = " << strcpy(s1,s2) << endl; // содержимое строки s2 скопировалось в строку s1, возвращается указатель на s1 cout << "s1= " << s1 << endl; // вывод содержимого строки s1 char s3[7]; // резервируем строку для следующей функции cout << strncpy(s3, s2, 7) << endl; // копируем 7 символов из строки s2 в строку s3 system("pause"); return 0; } |
В строках 9, 10 создаём строковые массивы на 27 символов, словосочетание "Counter-Strike 1.6 forever" содержит 26 символов, последнее место в массиве займет нуль-символ. В строке 11 функция strcpy(s1,s2) копирует значение строки s2 в строку s1 и возвращает указатель на строку s1. Если строка s1 будет меньше строки s2, то скопируется то количество символов, которое вместится в строку s2. Строка 10 всего лишь показывает, что в строке s1 содержится скопированное значение. В строке 14 функция strncpy(s3, s2, sizeof(s3)) выполняет копирование 7 символов строки s2 в строку s3 .
Постановка задачи:
Используя ввод-вывод в стиле С++ научиться использовать основные операторы работы со строками
Произвести конкатенацию строк с помощью оператора strcat()
Вывести полученный результат на экран на экран.
Произвести копирование строк, вывести результат на экран.
Подсчитать количество символов в строке.
Методические указания.
Конкатенацию строк произвести на примере фамилии, имени, отчества обучающегося, введенных с клавиатуры.
Копирование строк произвести на примере латинского алфавита. Использовать первые 10 символов, введенные с клавиатуры.
С помощью оператора strlen подсчитать длину строки. В качестве опытного образца использовать предложение «Быть или не быть?»
Содержание отчета Постановка задачи (общая и для конкретного варианта). Определения функций для реализации поставленных задач. Определение функции main(). Содержимое исходного файла Содержимое модифицированного файла.