Массивы символов

Последнее обновление: 22.02.2023

Свои особенности имеют символьные массивы. При инициализации мы можем передать символьному массиву как набор символов, так и строку:

char hello1[] {'h', 'e', 'l', 'l', 'o'};
char hello2[] {"hello"};	// {'h', 'e', 'l', 'l', 'o', '0'}

На первый взгляд оба массива имеют один и тот же набор символов, пусть в первом случае это просто набор отдельных символов, а во втором - строка. Но в первом случае - массив hello1 будет иметь пять элементов. А во втором случае массив hello2 будет иметь не 5 элементов, а 6, поскольку при инициализации строкой в символьный массив автоматически добавляется нулевой символ '\0'.

hello2[0]

hello2[1]

hello2[2]

hello2[3]

hello2[4]

hello2[5]

h

e

l

l

o

\0

Способ определения символьного массива влияет на работу с ним. Так, при выводе на консоль оператор count отобразит всю строку до символа "\0". В конце обязательно должен быть символ '\0', иначе на консоль будут выводится символы из последовательных ячеек памяти, которые содержат мусор, пока не встретится либо нулевой символ, либо не произойдет недопустимый доступ к памяти. Например, сравним вывод трех символьных массивов:

#include <iostream>
 
int main()
{   
    char hello1[]{'h', 'e', 'l', 'l', 'o'};
    char hello2[]{'h', 'e', 'l', 'l', 'o', '\0'};
    char hello3[]{"hello"};
    
    std::cout << hello1 << std::endl;
    std::cout << hello2 << std::endl;
    std::cout << hello3 << std::endl;
}

Пример консольного вывода:

hello╨J:╕╗☻
hello
hello

В первом случае консольный вывод не детерминирован, поскольку символьный массив не заканчивается нулевым символом.

Двухмерные массивы символов

Выше мы рассматривали, что строку можно представить в виде массива символов. Как же тогда нам представить массив строк? Для этого можно использовать двухмерный массив символов:

#include <iostream>
 
int main()
{   
    const int max_length{50}; // максимальная длина строки (включая нулевой байт \0)
    char langs[][max_length] 
    {
        "C++", "C#",  "Python", "Java",
        "Kotlin", "Go", "Dart", "PHP"
    };
    std::cout << langs[0] << std::endl;     // C++
    std::cout << langs[1] << std::endl;     // C#
    std::cout << langs[2] << std::endl;     // Python
}

Здесь массив langs содержит 8 элементов (8 строк). Максимальное количество символов (условно стобцов) в каждой строке задается с помощью константы max_length. Но непосредственно сами строки массива необязательно должны достигать этой длины. Например, в строке "C++" только четыре символа (3 + автоматически добавляемый нулевой символ). Все остальные элементы получают по умолчанию нулевые значения.

И поскольку каждый элемент массива langs представляет строку, то мы можем получить по индексу нужную строку и вывести на консоль.

Перебор двухмерных символьных массивов

Так как вложенные массивы представляют строки или массивы символов, то каждый такой массив мы можем ввести на консоль в виде строки:

#include <iostream>
  
int main()
{
    char langs[][20] { "C++", "Python", "JavaScript"};
    for(auto lang : langs)
    {
        std::cout << lang << std::endl;
    }
}

Здесь при переборе массива langs, каждый его отдельный элемент - массив символов будет помещаться в переменную lang. И далее мы можем вывести этот массив в виде строки на консоль.

Ввод символьных массивов/строк с консоли

Функция getline() потока cin считывает последовательность символов, включая пробелы. По умолчанию, ввод заканчивается, когда считывается символ перевода строки '\n' (например, при нажатии клавиши Enter). Функция getline() имеет две версии. Первая версия принимает два параметра: первый параметра указывает на массив символов для хранения введенных данных, а второй параметр указывает на максимальное количество символов, которое надо сохранить в массив. Это количество включает символ завершения строки - нулевой байт '\0', который автоматически добавляться в конец ввода:

#include <iostream>
 
int main()
{   
    const int max_length {100};    // максимальное количиство считываемых символов
    char text[max_length] {};       // массив для считывания строки
    std::cout << "Enter some text:" << std::endl;
    // считываем символы, включая пробелы
    std::cin.getline(text, max_length);
    std::cout << "You entered:\n" << text << std::endl;
}

В данном случае считываем не более 100 символов в массив text. Пример ввода:

Enter some text:
Hello METANIT.COM
You entered:
Hello METANIT.COM

Другая форма функции getline() также принимает третий параметр - символ, который будет выступать сиигналом завершения ввода. Например

#include <iostream>
 
int main()
{   
    const int max_length {100};    // максимальное количиство считываемых символов
    char text[max_length] {};       // массив для считывания строки
    std::cout << "Enter some text:" << std::endl;
    // считываем символы, включая пробелы
    std::cin.getline(text, max_length, '!');
    std::cout << "You entered:\n" << text << std::endl;
}

Здесь в качестве символа окончания ввода выступает восклицательный знак !, поэтому при считывании он не будет включаться в строку:

Enter some text:
Hello World!
You entered:
Hello World
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850