Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
30.05.2020
Размер:
428.13 Кб
Скачать

при помещении в выходной поток cout имени символьного массива выводится не

адрес массива (как для массивов с элементами другого типа), а его содержимое (до

завершающего символа ‘\0’).

//пример_1 int main()

{

char str1[] = "string-array"; // строка-массив: str1– указатель-константа

cout <<

str1

<< endl;

// на неконстантные данные, инициализируется литералом

//выведет: string-array

// str1++;

 

 

//

error!!!, str1 – указатель-константа

str1[0]='a';

 

//

да, str1 – указатель на неконстантные данные

cout <<

str1[0]<< endl;

// выведет первый элемент строки: a

char* str2 =

"string-pointer"; // строка-указатель: str2неконстантный указатель

cout <<

str2

<< endl;

// на константу, инициализируется адресом литерала

//выведет: stringpointer

str2++;

str2<< endl;

//

да, str2 – неконстантный указатель

cout <<

//выведет: tring-pointer

// str2[1]='a';

 

//

error!!!, str2 – указатель на константу

_getch(); return 0;

}

//пример_2 int main()

{ char *otvet[][10] = {"odin", "dwa"}; //массив указателей-констант на неконстантные

cout << otvet[0] << endl;

 

//данные, инициализируется значениями литералов

 

//вывод строки как элемента массива строк: odin

cout << otvet[1] << endl;

 

//вывод строки как элемента массива строк: dwa

// otvet[0]++;

// error!!!, otvet указатель-константа

otvet [0][0]='a';

//

да, otvet указатель на неконстантные данные

cout << otvet [0][0]<< endl;

//выведет: a

char *otvet1[] = {"odin", "dwa"};

//массив неконстантных указателей на константные

cout << otvet1[0] << endl;

//данные, инициализируется адресами литералов

//вывод строки как элемента массива указателей:odin

cout << otvet1[1] << endl;

//вывод строки как элемента массива указателей:dwa

otvet1[0]++;

// да, otvet1 неконстантный указатель

cout << otvet1[0] << endl;

//выведет: din

// otvet1[0][0]='a';

//error!!!,otvet1 указатель на константные данные

_getch(); return 0;

}

Операции со строками

Для работы с С-строками используются библиотечные функции языка С, описанные в заголовках <string.h> и <сstring>, однако надо учитывать, что в этих функциях нет контроля за границами строк.

Инициализация строки

Строка-массив может быть проинициализирована символьными значениями поэлементно. Чтобы символьный массив был представлен как строка, в его конец необходимо поместить завершающий символ ‘\0’– признак конца строки. В этом случае в процессе выполнения программы отслеживается текущая длина строки, а при выводе

Программирование – лекция 13 (лекции Стрикелевой Л.В.)

4

 

(помещении в поток cout идентификатора массива) – выводится его содержимое, а не адрес (как для обычного массива).

char stroka[6] = {'M', 'i', 'n', 's', 'k', '\0'}; char stroka1[ ] = {'M', 'i', 'n', 's', 'k', '\0'};

char stroka2[6] = "Minsk"; // \0добавляется в конец строки автоматически char stroka3 [ ] = "Minsk"; // \0добавляется в конец строки автоматически char *string1 = "Minsk"; // \0добавляется в конец строки автоматически

//пример_3 int main()

{

const int MAX = 80;

//максимальный размер строки

char str [MAX];

//определение строки как символьного массива

cin >> str;

//ввод строки, количество символов < 80

char s[ ] = "abc";

//один символ оставляем для нуль-символа ’\0’

//определение и инициализация строки s строковым литералом

 

//символ \0добавляется в конец строки автоматически

 

//размер строки равен 4: 3 символа +’\0’, длина строки равна 3

char m[ ] = {'a', 'b', 'c'}; //определение и инициализация массива символов m

cout << m << endl;

//размер массива равен 3, нет символа ’\0’

//результаты вывода – ???, до случайно встреченного ’\0’

char ss[ ] = {'a', 'b', 'c', '\0'}; //определение и инициализация строки ss

char str1[] = "Minsk";

//размер строки ss равен 4, длина строки равна 3

// строка-массив, проинициализирована строковым литералом,

// размер str1 равен 6, длина str1 равна 5

//символ \0добавляется в конец строки автоматически

_getch(); return 0;

}

Строка-указатель инициализируется строковым литералом, который в формате С- строки располагается в сегменте данных загрузочного модуля программы. Имя строки становится синонимом адреса первого символа литерала.

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

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

Однако, если литерал используется в выражении в тех местах, где разрешается применять указатель, компилятор подставляет в выражение вместо литерала адрес первого символа. Например:

char *st =

"Literal";

//

'\0'добавляется в конец литерала автоматически

cout

<<

st

<< endl;

//

Literal

cout

<<

*st << endl;

// L

НО!!!

cout << sizeof

(st) << endl;

// размер указателя: 4

 

cout

<<

sizeof(*st)

<<

endl;

//

размер одного

символа: 1

cout

<<

strlen

(st)

<<

endl;

//

длина строки:

7, без

‘\0’

//прототип функции strlen() в <string.h>

Если строка инициализируется литералом, идентичным ранее записанному, то используется ссылка на уже имеющийся литерал.

Возможные ошибки при работе со строками

Основные ошибки при работе с С-строками происходят из-за отсутствия понимания специфики описания строк (строка-массив или строка-указатель)

//пример_4

Программирование – лекция 13 (лекции Стрикелевой Л.В.)

5

 

Соседние файлы в папке Лабораторні роботи