Не зависят от конкретного компьютера Язык Си
Скачать 5.8 Mb.
|
Строки и символьные массивы char s3[ ] = "strcmp, strncmp – функции сравнения строк"; cout << "s3: \"" << s3 << "\"" << endl << endl; cout << "s1 < s3 -> " << setw(2) << strcmp(s1,s3) << endl << endl; char s4[ ] = "strcmp"; cout << "s4: \"" << s4 << "\"" << endl << endl; cout << "s1 > s4 -> " << setw(2) << strcmp(s1,s4) << endl << endl; char s5[ ] = "Strcmp, Strncmp"; cout << "s5: \"" << s5 << "\"" << endl << endl; cout << "s1 != s5 -> " << setw(2) << strcmp(s1,s5) << endl; … } Строки и символьные массивы Результат работы программы: Строки и символьные массивы Пример сравнения введенных паролей. … #include int main() { … char password_1[11] = ""; cout << "Введите пароль не более 10 символов: "; gets (password_1); cout << endl; char password_2[11] = ""; do { cout << "Повторите пароль: "; gets (password_2); cout << endl; Строки и символьные массивы if (strcmp(password_1, password_2) != 0) cout << "Введенные пароли не совпадают" << endl << endl; else cout << "Проверка прошла успешно" << endl << endl; } while (strcmp(password_1, password_2) != 0); … } Строки и символьные массивы Результат работы программы: Строки и символьные массивы Преобразование строк в числа. Функции atof(), atoi(), atoll(). Содержатся в заголовочном файле Прототип функции atof(): double atof(const char * string); Функция atof() преобразует строку в значение типа double. Строки и символьные массивы Функция atof() сначала отбрасывает табуляции и пробелы. Затем, начиная с первого символа, отличного от пробела или табуляции функция atof() считывает символы, пока литерал в строке напоминает синтаксис чисел с плавающей точкой, и интерпретирует их в числовое значение. Остальная часть строки после последнего допустимого символа игнорируется. Строки и символьные массивы Допустимое число с плавающей точкой формируется функцией atof() из следующих символов: знаки плюс и минус; последовательность цифр, которые могут содержать десятичную точку; число, записанное в экспоненциальной форме. Такая форма может содержать символы е или Е, за которыми следуют знаки плюс или минус и последовательность цифр. Строки и символьные массивы Если первая последовательность не пробельных символов в строке string не формируют число с плавающей точкой, или строка string содержит только пробельные символы, то преобразование строки в число не выполняется. Функция atof() возвращает нулевое значение. В противном случае, функция atof() возвращает преобразованное число с плавающей точкой типа double. Строки и символьные массивы Прототип функции atoi(): int atoi(const char * string); Функция atoi() преобразует строку в значение типа int. Функция atoi() сначала отбрасывает символы пробелов и табуляции. Затем, функция atoi() считывает необязательный начальный знак плюс или минус и следующую за ним последовательность чисел и интерпретирует их в числовое значение. Остальная часть строки после последнего допустимого символа игнорируется. Строки и символьные массивы Если первая последовательность не пробельных символов в строке string не формируют целое число, или строка string содержит только пробельные символы, то преобразование строки в число не выполняется. Функция atoi() возвращает нулевое значение. В противном случае, функция atoi() возвращает преобразованное целое число типа int. Строки и символьные массивы Прототип функции atoll(): long int atoll(const char * string); Функция atoll() преобразует строку в значение типа long int. Функция atoll() аналогична функции atoi(). Строки и символьные массивы Если первая последовательность не пробельных символов в строке string не формируют длинное целое число, или строка string содержит только пробельные символы, то преобразование строки в число не выполняется. Функция atoll() возвращает нулевое значение. В противном случае, функция atoll() возвращает преобразованное длинное целое число с типа long int. Строки и символьные массивы Пример вычисления значения выражения, состоящего из целых чисел и знаков сложения и вычитания. … #include int main() { … char str[]="-2+12+121-21"; cout << "Вы ввели: " << str << endl; char *strPtr = str; int rez = atoi(strPtr); strPtr++; Строки и символьные массивы while (strPtr = strpbrk(strPtr,"+-")){ rez += atoi(strPtr); strPtr++; } cout << "Результат вычисления: " << rez << endl; … } Результат работы программы: Строки и символьные массивы Прототип функции strpbrk() int *strpbrk(char * str1, const char * str2); str1 – строка, в которой выполняется поиск str2 – строка, содержащая искомые символы Функция strpbrk() выполняет поиск первого вхождения в строку str1 любого из символов строки str2. Функция возвращает указатель на первый найденный символ в строке str1. Если в строке str1 не найден ни один из символов строки str2, то функция strpbrk() возвращает пустой указатель NULL. Строки и символьные массивы Можно описать массивы строк: char ИмяМассива [ Кол-воЭлементов1 ] [ Кол-воЭлементов2 ]; Например, char str[3][15] = {"Пример", "использования", "строк"}; определяет массив из 3 строк по 15 байт в каждой. Строку можно разместить в динамической памяти, но в этом случае ее нельзя инициализировать текстовой константой. Строки и символьные массивы Строковые указатели являются адресами, которые определяют местонахождение первого символа строки, сохраненной в памяти. Строковые указатели объявляются как char *: char *stringPtr; При выделении памяти для строкового указателя используются оператор new или функции malloc() или calloc(). Строки, объявленные с помощью указателей, более удобны в применении, особенно при передаче их в качестве аргументов функций. Строки и символьные массивы В целом, работа с динамическими строками ничем не отличается от случая, когда они статические. Когда выделенная оперативная память больше не нужна, ее нужно освободить при помощи оператора delete, если при выделении памяти для строкового указателя использовался оператор new, или функции free(), если при выделении памяти для строкового указателя использовались функции malloc() или calloc(). Строки и символьные массивы Пример ввода-вывода элементов массива строк. … int main() { … char M[3][50]; int i; for (i = 0; i < 3; i++){ cout << "Введите Фамилию Имя Отчество: "; gets (M[i]); } cout << endl; for (i = 0; i < 3; i++) cout << M[i] << " "; cout << endl; … } Строки и символьные массивы Результат работы программы: Строковый класс В С++ встроенный строковый тип отсутствует. Имеются следующие возможности для работы со строками: символьный массив сhar имя_строки[размер_строки]; указатель на символьный массив char *имя_строки; класс string Строковый класс Обратите внимание. При создании объекта класса string мы практически получаем динамически изменяющийся массив, т.е. объект, для которого нет необходимости задавать начальные размеры. Для работы с классом string необходимо подключить заголовочный файл #include Строковый класс Также рекомендуется подключить пространство имен namespace: using namespase std; В противном случае вместо string необходимо везде указывать описатель класса std::string. Индексный доступ к элементам строки, объявленной как объект класса string, осуществляется обычным образом. Строковый класс является классом-контейнером, поэтому поддерживает все алгоритмы обработки строк библиотеки стандартных шаблонов. Строковый класс Ввод объектов класса string осуществляется с помощью операции потока ввода >> или метода getline(). Обратите внимание, операция потока ввода >>, как и в случае с символьными массивами, позволяет вводить объект класса string только до первого пробела. Метод getline() позволяет вводить строки, содержащие пробелы, а также сообщения, состоящие из нескольких строк. getline(cin, имя_строки); Строковый класс Метод getline() считывает данные из потока cin и записывает их в переменную имя_строки. Объявление объекта класса string: string имя_строки; Например, string str; // пустая строка Строковый класс Объект класса string можно инициализировать при объявлении: string имя_строки(s); s – строковая константа Например, string str("Тест"); Строковый класс Объект класса string можно инициализировать другим объектом того же типа: string имя_строки_1(имя_строки_2); Например, string str1(str2); //строка str1 инициализируется строкой str2 В классе string наряду с функциями обработки строк используются операции: = – операция присваивания Например, s1 = s2; // строка s2 копируется в строку s1 Строковый класс += или (+) – операция конкатенации строк, Например, string s3 = s1 + s2; // строкa s3 состоит из конкатенации строк s1 и s2 s1 += s2; // добавляет к строке s1 строку s2, результат хранится в строке s1 Строки и символьные массивы Пример объединения строк. … #include int main() { … string str1, str2; cout << "Первая строка: "; getline(cin, str1); cout << "Вторая строка: "; getline(cin, str2); string str3 = str1 + " " + str2 + "\n"; cout << " "\nРезультат объединения строк: " << str3; … } Строки и символьные массивы Результат работы программы: Строковый класс Операция сложения может конкатенировать объекты класса string не только между собой, но и с Си-строками (строками встроенного типа). Перепишем предыдущий пример так, чтобы специальный символ «пробел» представлялся встроенным типом, а значимые символы – объектами класса string: Строковый класс … #include int main() { … string str1, str2; const char *symbol = " "; cout << "Первая строка: "; getline(cin, str1); cout << "Вторая строка: "; getline(cin, str2); string str3 = str1 + symbol + str2 + "\n"; cout << " "\nРезультат объединения строк: " << str3; … } Строковый класс Результат работы программы аналогичен полученному при выполнении примера конкатенирования объектов класса string между собой. Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Строковый класс Возможно и присваивание встроенной строки объекту класса string: Например, string str; const char *strPtr = "Си-строка"; str = strPtr; Обратите внимание, обратное преобразование не работает. Для осуществления данного преобразования используется функция c_str(). Строковый класс Функция c_str() возвращает указатель на символьный массив, который содержит строку объекта класса string в том виде, в котором она размещалась бы, во встроенном строковом типе. Например, string str; const char *strPtr = str.c_str() Строковый класс Сравнение объектов класса string на основе лексикографического порядка можно осуществлять с помощью операторов: == , != , > , < Результатом сравнения является булевое значение (0, если false, или 1, если true). Например, s1 == s2; // проверяется совпадение строки s2 со строкой s1 Равными считаются полностью идентичные строки. Строковый класс Рассмотрим базовые методы обработки строк класса string. Для получения длины строки используются методы size() и length(). Оба метода возвращают количество символов в строке: имя_строки.size(); имя_строки.length(); Строковый класс Пример определения длины строки … #include int main() { … string str("Пример работы с классом string"); cout << "size\n" << endl; cout << "Длина строки \"" << str << "\" " << str.size() << " символов\n" << endl; cout << "length\n" << endl; cout << "Длина строки \"" << str << "\" " << str.length() << " символов" << endl; … } Строки и символьные массивы Результат работы программы: Строковый класс Для проверки строки объекта класса string на наличие в ней данных используется метод empty(), который возвращает true, если строка пустая, и false в противном случае. Для очистки содержимого строки объекта класса string применяется метод clear(). Строковый класс Пример очистки содержимого строки и проверки наличия в строке данных … #include int main() { … string str = "Методы для работы с объектами класса string"; cout << "Строка пустая? " << str.empty() << "\n"; cout << "Длина строки " << str.size() << " символов\n\n"; cout << "Очистка содержимого строки…\n\n"; str.clear(); cout << "Теперь строка пустая? " << str.empty() << "\n"; cout << "Длина строки " << str.size() << " символов\n"; … } Строки и символьные массивы Результат работы программы: Строки и символьные массивы Методы получение информации об объекте класса string: Строки и символьные массивы Методы модификации строк. Модификация строки заключается в удалении, вставке или замене ее фрагмента. Строки и символьные массивы Методы поиска подстрок и отдельных символов в строке. Функции Функция – это поименованный набор описаний и операторов, выполняющих определенную задачу. До первого обращения к функции она должна быть описана. Обращение к функции называется вызовом. Общий вид вызова функции: имя_функции([имя_параметра_1, …, имя_параметра_N]); Примечание: функции могут не иметь параметров, тогда в круглых скобках ничего не пишется. |