C++. Массивы строк типа string. Примеры

C++. Массивы строк типа string. Примеры

В данной теме приводятся примеры решения наиболее распространенных задач с массивами строк типа string.


Содержание


1. Создание массива строк типа string. Статический и динамический массив строк

В старших версиях компиляторов чтобы работать с типом string нужно подключить модуль <string>

#include <string>

Для массива строк память можно выделять

  • статически. В этом случае указывается фиксированное константное значение массива на этапе компиляции;
  • динамически с помощью оператора new. В этом случае размер массива создается динамически и может задаваться в процессе выполнения программы.

 

2. Инициализация массива строк типа string. Пример

В примере инициализируется массив строк типа string. Память для массива выделяется статически (фиксированно).

#include <iostream>
#include <string>
using namespace std;

void main()
{
  // Массивы строк типа string
  // 1. Инициализация массива строк указанием размера массива
  const int N_DAYS = 7;
  string daysOfWeek[N_DAYS] = { "Sunday", "Monday", "Tuesday",
  "Wednesday", "Thirsday", "Friday", "Saturday" };

  // Вывод массива строк на экран
  cout << "Array of days:\n";
  for (int i = 0; i < N_DAYS; i++)
  {
    cout << "Day " << i << " = " << daysOfWeek[i] << ::endl;
  }

  // 2. Инициализация без указания размера массива
  string Numbers[] { "One", "Two", "Three" };

  // Вывод массива на экран
  cout << "\nArray of Numbers:" << ::endl;
  for (int i = 0; i < 3; i++)
    cout << Numbers[i] << endl;
}

Результат работы программы

Array of days:
Day 0 = Sunday
Day 1 = Monday
Day 2 = Tuesday
Day 3 = Wednesday
Day 4 = Thirsday
Day 5 = Friday
Day 6 = Saturday

Array of Numbers:
One
Two
Three

 

3. Пример создания динамического массива строк заданного размера

В программе с клавиатуры вводится размер массива n. Затем для этого массива выделяется память динамически.

#include <iostream>
#include <string>
using namespace std;

void main()
{
  // Массивы строк типа string
  // Создание динамического массива строк размера n
  // 1. Объявить массив строк
  string *AS; // указатель на тип string
  int n; // количество элементов в массиве AS

  // 2. Ввести размер массива
  cout << "n = ";
  cin >> n;

  // 3. Проверка на корректность ввода
  if (n <= 0)
  {
    cout << "Wrong value of n." << endl;
    return;
  }

  // 4. Динамическое выделение памяти для массива AS
  AS = new string[n];

  // 5. Заполнение массива AS произвольными значениями
  for (int i = 0; i < n; i++)
    AS[i] = (char)('1' + i);

  // 6. Вывод массива AS
  cout << "\nArray AS:" << ::endl;
  for (int i = 0; i < n; i++)
    cout << "AS[" << i << "] = " << AS[i].c_str() << endl;

  // 7. После завершения работы с массивом AS,
  // нужно обязательно освободить выделенную для него память
  delete[] AS;
}

Результат выполнения программы

n = 7

Array AS:
AS[0] = 1
AS[1] = 2
AS[2] = 3
AS[3] = 4
AS[4] = 5
AS[5] = 6
AS[6] = 7


 

4. Пример ввода строк с клавиатуры и формирование массива этих строк

В примере последовательно вводятся строки и формируется массив этих строк. Конец ввода – пустая строка «».

#include <iostream>
using namespace std;

void main()
{
  // Массивы строк в C++. Строки типа string
  // Организация ввода строк с клавиатуры и формирование массива

  // 1. Объявление переменных
  string* AS; // массив вводимых строк, это результат
  string* AS2; // дополнительный массив строк
  int count; // количество элементов в массиве
  string s; // дополнительная переменная-строка
  char buf[80]; // буфер для ввода строк

  // 2. Цикл ввода строк, конец ввода - пустая строка ""
  cout << "Enter strings:\n";
  count = 0;
  AS = nullptr;

  do
  {
    // 2.1. Ввести строку в массив типа char[]
    cout << "=> ";
    cin.getline(buf, 80, '\n'); // строки вводятся с пробелами

    // 2.2. Скопировать строку char[] в строку типа string
    s = buf;

    // 2.3. Если введена не пустая строка
    if (s != "")
    {
      // 2.3.1. Увеличить количество строк
      count++;

      // 2.3.2 Освободить память для нового массива
      AS2 = new string[count];

      // 2.3.3. Скопировать данные из старого массива в новый
      for (int i = 0; i < count - 1; i++)
        AS2[i] = AS[i];

      // 2.3.4. Добавить введенную строку в новый массив
      AS2[count - 1] = s;

      // 2.3.5. Освободить память, выделенную под старый (предыдущий) массив
      if (AS != nullptr)
        delete[] AS;

      // 2.3.6. Перенаправить указатель из предыдущего массива AS на массив AS2
      AS = AS2;
    }
  } while (s != "");

  // 3. Вывести созданный массив AS на экран
  cout << "\nArray AS is as follows:\n";
  if (count > 0)
    for (int i = 0; i < count; i++)
      cout << "AS[" << i << "] = " << AS[i] << ::endl;
  else
    cout << "array AS is empty.";

  // 4. После использования массива AS освободить память, выделенную для него
  delete[] AS;
}

Результат выполнения программы

Enter strings:
=> abc def
=> Hello world!
=> bestprog.net
=> This is a text.
=>

Array AS is as follows:
AS[0] = abc def
AS[1] = Hello world!
AS[2] = bestprog.net
AS[3] = This is a text.

 

5. Пример сортировки массива строк методом вставки

В примере формируется массив из count элементов. Затем происходит сортировка этого массива и вывод результата на экран.

#include <iostream>
using namespace std;

void main()
{
  // Массивы строк в C++. Строки типа string
  // Сортировка массива строк методом вставки

  // 1. Объявление переменных
  string* AS; // массив строк, который нужно отсортировать
  int count; // количество элементов в массиве
  string s; // дополнительная переменная-строка
  char buf[80]; // буфер для ввода строк

  // 2. Ввести количество элементов в массиве
  cout << "count = ";
  cin >> count;

  // 3. Проверка, корректно ли значение count
  if (count <= 0)
  {
    cout << "Incorrect input.";
    return;
  }

  // 4. Выделить память для count строк
  AS = new string[count];

  // 5. Цикл ввода строк в массив
  cout << "Enter strings:\n";
  cin.ignore(4096, '\n');

  for (int i = 0; i < count; i++)
  {
    // строки вводятся с пробелами
    cout << "=> ";
    cin.getline(buf, 80, '\n');
    AS[i] = buf; // скопировать строку
  }

  // 6. Вывод введенного массива для проверки
  cout << "\nArray AS:" << ::endl;
  for (int i = 0; i < count; i++)
    cout << "A[" << i << "] = " << AS[i] << ::endl;

  // 7. Сортировка массива AS по возрастанию
  for (int i=0; i<count-1;i++)
    for (int j=i; j>=0;j--)
      if (AS[j] > AS[j + 1])
      {
        // поменять местами строки
        s = AS[j];
        AS[j] = AS[j + 1];
        AS[j + 1] = s;
      }

  // 8. Вывод посортированного массива AS
  cout << "\nSorted array AS:\n";
  for (int i = 0; i < count; i++)
    cout << "AS[" << i << "] = " << AS[i] << endl;

  // 9. Освобождение памяти, выделенной для массива AS
  delete[] AS;
}

Результат работы программы

count = 8
Enter strings:
=> q w e
=> sds
=> ds sdjh
=> Adss
=> Dc kdshk
=> sdkjk
=> s1 s2 s3
=> dd12 29918

Array AS:
A[0] = q w e
A[1] = sds
A[2] = ds sdjh
A[3] = Adss
A[4] = Dc kdshk
A[5] = sdkjk
A[6] = s1 s2 s3
A[7] = dd12 29918

Sorted array AS:
AS[0] = Adss
AS[1] = Dc kdshk
AS[2] = dd12 29918
AS[3] = ds sdjh
AS[4] = q w e
AS[5] = s1 s2 s3
AS[6] = sdkjk
AS[7] = sds

 

6. Пример поиска заданной строки в массиве строк

В примере демонстрируется алгоритм поиска строки в массиве строк.

#include <iostream>
#include <string>
using namespace std;

void main()
{
  // Массивы строк в C++. Строки типа string
  // Поиск строки в массиве строк

  // 1. Объявление переменных
  string* AS; // массив строк
  int count; // количество элементов в массиве
  string s; // искомая строка
  char buf[80]; // буфер для ввода строк

  // 2. Ввести количество элементов в массиве
  cout << "count = ";
  cin >> count;

  // 3. Проверка, корректно ли значение count
  if (count <= 0)
  {
    cout << "Incorrect input.";
    return;
  }

  // 4. Выделить память для count строк
  AS = new string[count];

  // 5. Цикл ввода строк в массив
  cout << "Enter strings:\n";
  cin.ignore(4096, '\n');

  for (int i = 0; i < count; i++)
  {
    // строки вводятся с пробелами
    cout << "=> ";
    cin.getline(buf, 80, '\n');
    AS[i] = buf; // скопировать строку
  }

  // 6. Вывод введенного массива для проверки
  cout << "\nArray AS:" << ::endl;
  for (int i = 0; i < count; i++)
    cout << "A[" << i << "] = " << AS[i] << ::endl;

  // 7. Ввод искомой строки
  cout << endl << "Enter string:" << endl;
  cin.getline(buf, 80, '\n');
  s = buf; // в переменной s - введенная строка

  // 8. Поиск строки s в массиве AS
  bool f_is = false;
  for (int i = 0; i < count; i++)
    if (s == AS[i])
    {
      // если строка найдена,
      f_is = true;
      break; // то выйти из цикла
  }

  // 9. Вывод результата
  if (f_is)
    cout << "String \"" << s << "\" is in the array AS." << endl;
  else
    cout << "String \"" << s << "\" is not in the array AS." << endl;

  // 10. Освобождение памяти, выделенной для массива AS
  delete[] AS;
}

Результат работы программы

count = 5
Enter strings:
=> a s
=> b cd
=> ddd
=> ef ghi
=> jkl

Array AS:
A[0] = a s
A[1] = b cd
A[2] = ddd
A[3] = ef ghi
A[4] = jkl

Enter string:
ef ghi
String "ef ghi" is in the array AS.

 

7. Пример определения количества строк в массиве строк в соответствии с заданным условием

Задан массив строк. Нужно вычислить количество строк, которые начинаются с символа ‘+’.

#include <iostream>
#include <string>
using namespace std;

void main()
{
  // Массивы строк в C++. Строки типа string
  // Подсчет количества вхождений строки в массиве строк

  // 1. Объявление переменных
  string* AS; // массив строк
  int count; // количество элементов в массиве
  int number; // количество строк, которые начинаются на '+'
  char buf[80]; // буфер для ввода строк

  // 2. Ввести количество элементов в массиве
  cout << "count = ";
  cin >> count;

  // 3. Проверка, корректно ли значение count
  if (count <= 0)
  {
    cout << "Incorrect input.";
    return;
  }

  // 4. Выделить память для count строк
  AS = new string[count];

  // 5. Цикл ввода строк в массив
  cout << "Enter strings:\n";
  cin.ignore(4096, '\n');

  for (int i = 0; i < count; i++)
  {
    // строки вводятся с пробелами
    cout << "=> ";
    cin.getline(buf, 80, '\n');
    AS[i] = buf; // скопировать строку
  }

  // 6. Ввод массива AS для проверки
  cout << "\nArray AS:" << ::endl;
  for (int i = 0; i < count; i++)
    cout << "A[" << i << "] = " << AS[i] << ::endl;

  // 7. Цикл вычисления number
  number = 0;
  for (int i = 0; i < count; i++)
    if ((AS[i].length() > 0) && (AS[i][0] == '+')) // если строка непустая и первый символ '+'
      number++;

  // 8. Вывод результата
  cout << endl << "number = " << number << endl;

  // 9. Освобождение памяти, выделенной для массива AS
  delete[] AS;
}

Результат работы программы

count = 7
Enter strings:
=> +as
=> -lskd lskd
=> bdc sldk
=> +200
=> a+b
=> dn dd dy
=> fds sds

Array AS:
A[0] = +as
A[1] = -lskd lskd
A[2] = bdc sldk
A[3] = +200
A[4] = a+b
A[5] = dn dd dy
A[6] = fds sds
number = 2

 


Связанные темы