
Определение длины строки – метод length()
Для определения длины строки служит метод length().
string my_string;
cout << "введите строку:\n";
getline(cin, my_string);
cout << "Длина введенной строки равна ";
cout << my_string.length() << endl;
Метод length() удобно использовать в цикле при обработке строк, например, следующая программа выводит строку наоборот:
string my_string;
cout << "Введите строку:\n";
getline(cin, my_string);
cout << "Строка наоборот:\n";
int l = my_string.length();
for (int i=str.length()-1; i>=0; i--) {
cout << my_string[i];
}
cout << endl;
Объединение двух строк
Как и во многих других современных языках программирования для объединения строк используется знак «плюс». Рассмотрим применение этой операции для решения следующей задачи: пользователь вводит свои фамилию, имя и отчество, а программа формирует строку, содержащую полное имя человека и выводит его на экран.
string name, surname, patronymic;
cout << "Введите имя:\n";
cin >> name;
cout << "Введите фамилию:\n";
cin >> surname;
cout << "Введите отчество:\n";
cin >> patronymic;
string fullname = name + " " +
patronymic + " " + surname;
cout << "Полное имя:\n";
cout << fullname << endl;
Передача строк в качестве аргументов функций
Строки могут быть переданы в качестве аргументов в функции аналогично другим типам данных. Тип string содержит информацию о своей длине, поэтому длину строки передавать в функцию не нужно. Напомним, что при передаче массива в функцию следует передавать и его размер, поскольку массив в языке C++ не содержит информацию о своей длине. Рассмотрим передачу строки в функцию на следующем примере. Создадим процедуру, которая принимает в качестве аргумента строку и выводит ее наоборот. Эту задачу мы уже решали при рассмотрении метода length(), теперь же оформим ее решение в виде функции (точнее, процедуры).
//Создаем процедуру с аргументом-строкой
void printReverseString(string str) {
for (int i=str.length()-1; i>=0; i--) {
cout << str[i];
}
cout << endl;
}
int main() {
string my_string;
cout << "Введите строку:\n";
getline(cin, my_string);
cout << "Введенная строка наоборот:\n";
//Вызываем созданную процедуру и передаем
//в нее введенную строку
printReverseString(my_string);
//Вызываем созданную процедуру и передаем
//в нее другие строки
printReverseString("Язык программирования C++");
printReverseString("Передаем строку аргументом");
return 0;
}
Возврат строки в качестве значения функции
Подобно другим типам данных строка может быть возвращена в качестве значения функции. Модифицируем еще раз программу о выводе строки наоборот. Создадим функцию, которая принимает в качестве аргумента строку и возвращает строку, являющуюся записью этой строки наоборот.
//Создаем функцию, которая принимает строку
//и возвращает ее, записанную наоборот
string getReverseString(string str) {
string result = "";
for (int i=str.length()-1; i>=0; i--) {
result += str[i];
}
return result;
}
int main() {
string my_string;
cout << "Введите строку:\n";
getline(cin, my_string);
cout << "Введенная строка наоборот:\n";
//Вызываем созданную процедуру и передаем
//в нее введенную строку
cout << getReverseString(my_string) << endl;
//Вызываем созданную процедуру и передаем
//в нее другие строки
cout << getReverseString("Программа") << endl;
cout << getReverseString("Аргумент") << endl;
return 0;
}
ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ
Задача 1. Создайте процедуру, которая принимает в качестве аргумента строку и выводит ее на экран, дублируя все латинские строчные гласные буквы. Например, eagle – eeaaglee. Используя созданную процедуру, продублируйте такие буквы в строках language и university.
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//Функция, которая проверяет, является ли
//символ латинской строчной гласной буквой
bool isLatinVowel(char ch) {
return ch=='a' || ch=='e' || ch=='i' ||
ch=='o' || ch=='u' || ch=='y';
}
//Процедура, дублирующая латинские строчные
//гласные буквы в строке
void duplicateLatinVowels(string str) {
for (int i=0; i<str.length(); i++) {
//Выводим очередной символ
cout << str[i];
//Выводим символ еще раз, если он является
//латинской строчной гласной буквой
if (isLatinVowel(str[i])) {
cout << str[i];
}
}
cout << endl;
}
int main() {
//Проверяем тестовый пример
duplicateLatinVowels("eagle");
//Дублируем гласные в требуемых словах
duplicateLatinVowels("language");
duplicateLatinVowels("university");
system("pause");
return 0;
}
Задача 2. Создайте функцию, которая принимает в качестве аргументов две строки, являющиеся двоичными записями некоторых чисел, а возвращает расстояние Хэмминга между этими числами. Расстояние Хэмминга – это количество двоичных разрядов, в которых числа различаются. Например, расстояние Хэмминга между числами 10101 и 11100 равняется 2. Используя созданную функцию, определите расстояние Хэмминга между числами 1111 и 101010.
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//Функция, дополняющая строку нулями
string addZeros(string str, int n_zeros) {
string zeros = "";
for (int i=0; i<n_zeros; i++) {
zeros += "0";
}
return zeros+str;
}
//Функция, вычисляющая расстояние Хэмминга
int hammingDistance(string str1, string str2) {
int l1 = str1.length();
int l2 = str2.length();
//Дополняем более короткую строку нулями
string s1, s2;
if (l1 < l2) {
s1 = addZeros(str1, l2-l1);
s2 = str2;
} else {
s1 = str1;
s2 = addZeros(str2, l1-l2);
}
//Вычисляем расстояние Хэмминга
int result = 0;
for (int i=0; i<s1.length(); i++) {
if (s1[i] != s2[i]) {
result++;
}
}
return result;
}
int main() {
//Проверяем тестовый пример
cout << hammingDistance("10101", "11100") << endl;
//Вычисляем расстояние для требуемых значений
cout << hammingDistance("1111", "101010") << endl;
system("pause");
return 0;
}
Задача 3. Создайте функцию, которая принимает в качестве аргумента строку и возвращает количество цифр в ней. Цифра – это один из символов от ‘0’ до ‘9’. Например, в строке «Сочи-2014» содержится четыре цифры. Используя созданную функцию, определите количество цифр в строке «31 декабря 2012 года».
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//Функция, которая проверяет, является ли
//символ цифрой
bool isDigit(char ch) {
string digits = "0123456789";
for (int i=0; i<digits.length(); i++) {
if (digits[i]==ch) {
return true;
}
}
return false;
}
//Функция определения количества цифр в строке
int n_digits(string str) {
int result = 0;
for (int i=0; i<str.length(); i++) {
if (isDigit(str[i])) {
result++;
}
}
return result;
}
int main() {
//Проверяем тестовый пример
cout << n_digits("Сочи-2014") << endl;
//Вычисляем количество цифр в требуемой строке
cout << n_digits("31 декабря 2012 года") << endl;
system("pause");
return 0;
}
Задача 4. Создайте функцию, которая принимает в качестве аргумента строку и возвращает true, если в этой строке есть две подряд идущие одинаковые буквы, и false – иначе. Например, в слове коммуникатор есть две такие буквы, а в слове машинист – нет. Используя созданную функцию, проверьте наличие двух подряд идущих одинаковых букв в словах лайнер и антенна.
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//Требуемая функция
bool hasRunningEquals(string str) {
for (int i=0; i<str.length()-1; i++) {
if (str[i] ==str[i+1]) {
return true;
}
}
return false;
}
int main() {
//Проверяем тестовые примеры
hasRunningEquals("коммуникатор") ?
cout << "Yes\n" : cout << "No\n";
hasRunningEquals("машинист") ?
cout << "Yes\n" : cout << "No\n";
//Проверяем требуемые строки
hasRunningEquals("лайнер") ?
cout << "Yes\n" : cout << "No\n";
hasRunningEquals("антенна") ?
cout << "Yes\n" : cout << "No\n";
cout << endl;
system("pause");
return 0;
}
Задача 5. Создайте процедуру, которая принимает аргументом строку и выводит ее, дублируя все цифры. Например, «Сочи-2014» – «Сочи-22001144». Используя созданную функцию, продублируйте цифры в следующей строке: «1 сентября 2012 года».
#include "stdafx.h"
#include <iostream>
#include <clocale>
#include <string>
using namespace std;
//Функция, которая проверяет, является ли
//символ цифрой
bool isDigit(char ch) {
string digits = "0123456789";
for (int i=0; i<digits.length(); i++) {
if (digits[i]==ch) {
return true;
}
}
return false;
}
//Процедура, дублирующая цифры в строке
void duplicateDigits(string str) {
for (int i=0; i<str.length(); i++) {
//Выводим очередной символ
cout << str[i];
//Выводим символ еще раз, если он - цифрой
if (isDigit(str[i])) {
cout << str[i];
}
}
cout << endl;
}
int main() {
setlocale(LC_ALL, "Russian");
//Проверяем тестовые примеры
duplicateDigits("Сочи-2014");
//Проверяем требуемые строки
duplicateDigits("1 сентября 2012 года");
system("pause");
return 0;
}
КОНТРОЛЬНЫЕ ВОПРОСЫ
Какие функции для ввода строк с клавиатуры и вывода строк на экран существуют? Приведите примеры.
Объясните использование кавычек и апострофов применительно к строкам и символам.
Как передавать строки в качестве аргументов функций? Приведите пример.
Почему передавать длину строки в функцию вместе с самой строкой не нужно?
Как передавать массивы строк в качестве аргументов функций? Приведите пример.