Содержание

Строки в С++

Символ конца строки '\0' - это нуль-символ: в языке C он используется для того, чтобы отмечать конец строки. Нуль-символ - не есть цифра 0; он не выводится на печать и в таблице кодов ASCII имеет номер 0. Наличие нуль-символа означает, что количество ячеек массива должно быть по крайней мере на одну больше, чем количество символов, которые необходимо размещать в памяти.

Строковая константа - это последовательность из нуля или более символов, заключенных в кавычки. Кавычки не являются частью строковой константы, а служат только для ее ограничения. Строки представляются в виде массива элементов типа char. Это означает, что символы строки можно представить расположенными в соседних ячейках памяти - по одному символу в ячейке.

Но массив символов - не всегда строка!

Не следует путать символьную константу со строкой, содержащей один символ: 'Х' - это не то же самое, что "Х". В первом случае - это отдельный символ. Во втором случае - это строка, состоящая из одного символа (буквы Х) и символа конца строки '\0'.

Правила инициализации строковых массивов

#include <iostream>
using namespace std;
int n=5;
char line[] = "Cat!"; // Инициализация строкового массива. 
                      	  
void main ()
{
      cout << "Word: ";
      // Показ на экран строкового массива. 	
      cout <<line;
}

Строки и указатели

В программе доступ к строке осуществляется с помощью указателя на символ. Если описать переменную message как

char *message;

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

message = "and bye!";

message станет указателем на строку.

#include <iostream>
using namespace std;

int main ()
{
      char *message;
      char privet[] = "and bye!";
      char *pr = privet;

      message = "Hello";
      cout << " " << message << " " << pr << "\n";
      int i = 0;
      while  (*(pr+i)!='\0')
      {
         cout<< *(pr+i++) << " ";
      }
}

Использование указателей часто применяется при работе с массивом строк. В этом случае к каждой строке можно обратиться с помощью указателя на его первый символ. Это удобно тем, что для перестановки двух строк, расположенных в неправильном порядке, фактически достаточно переставить указатели в массиве указателей, а не сами строки.

Рассматривается функция month_name(), которая возвращает указатель на строку, содержащий имя n-го месяца. Это типичная задача для использования строкового массива.

Функция month_name() содержит локальный массив строк и при обращении к ней возвращает указатель на нужную строку.

В описании массива указателей на символы name[] инициализатором является просто список строк. Символы i-й строки помещаются в определенное место памяти, а указатель на ее начало хранится в элементе name[i]. Поскольку размер массива name не указан, компилятор сам подсчитывает количество инициализаторов и соответственно устанавливает правильное число.

#include <iostream>
using namespace std;

char *month_name(int);

int main ()
{
      const int n=15;
      for (int i=0; i < n; i++)
         cout << "Month number " << i << " - " <<  month_name(i) <<"\n";
}

char *month_name (int k)  /* Название k-го месяца */
{
      static char *name[] = {
                              "none","January",
                              "February","March","April",
                              "May","June","July","August",
                              "September","October","November",
                              "December"
                            };
      return (k<1||k>12)?name[0]:name[k];
}

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

Month number 0 - none
Month number 1 - January
Month number 2 - February
Month number 3 - March
Month number 4 - April
Month number 5 - May
Month number 6 - June
Month number 7 - July
Month number 8 - August
Month number 9 - September
Month number 10 - October
Month number 11 - November
Month number 12 - December
Month number 13 - none
Month number 14 - none
Press any key to continue