Объявление строк и обращение к их элемента. Строка как массив символов типа char. Связь строк с указателями

Страницы работы

30 страниц (Word-файл)

Фрагмент текста работы

Строки

В ходе лекции необходимо усвоить:

·  Объявление строк и обращение к их элементам

·  Инициализацию и ввод-вывод строк

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

·  Связь строк с указателями

·  Передачу строки в функцию в качестве параметра

·  Обработку строк с использованием рекурсивных функций

В С++ отсутствует специальный строковый тип, и используется два вида строк:

•  строка как массив символов типа char;

•  строка как объект класса string (будем рассматривать позже).

В случае строки как массива символов, последним символом обязательно должен быть нуль-символ ’\0’, код которого равен 0. Поэтому к требуемой длине массива всегда необходимо добавлять 1 на нуль-символ. Такой массив будем далее называть строкой в формате ASCIIZ или просто ASCIIZ-строкой.

Как и другие типы данных, строки могут быть: переменными и константами. Строковый литерал – последовательность символов, заключенных в двойные кавычки.

Определение строки:

char имя_строки [длина];

const int MAX = 80;                   //максимальный размер строки

char str [MAX];   //строка, ее определение похоже на определение массива типа char

cin >>  str;                      //ввод строки, например, вводим строку “Minsk”                                         

char a[7] = ”abcdef”;   //длина строки а равна 7;

В строку можно вставить непечатаемые символы:

”abc\ndef”   //символы будут напечатаны в две строки

Длинная строка предполагает запись:

”abc\       def”            // напечатает abcdef; т.к. \ – символ продолжения строки.

НО ”abc<enter>                     def”                                 //даст  ошибку:

Строка ”abc\000def”   будет обрабатываться как abc (\0 – означает конец строки).

В строковой константе возможно использование нескольких строк:

”текст1””текст2””текст3”;

Описание строк возможно c использованием:

  1. директив препроцессора и строковых констант: #define OTVET1  ”odin”                  //строка-константа

const char str[n] ="dwa";

  1. массива типа char: char string [] = “Minsk”;  //строка-переменная,                                                    //проинициализированная строковым литералом

При этом идентичными являются следующие описания массива:

char string1 [] = “Minsk”;//нуль-символ добавляется к концу строки автоматически;    char string2 [6] = “Minsk”;

char string3 [6] = {‘M’, ‘i’, ‘n’, ‘s’, ‘k’, ‘\0’};

  1. указателя на тип char: char *string4 = “Minsk”;

Если строковый литерал применяется для инициализации массива типа char, адрес первого символа литерала становится синонимом имени массива. Переменная-указатель string4 получает начальное значение, равное адресу первого элемента (символ ‘M’) строкового литерала. Сам литерал в формате ASCIIZ-строки располагается в сегменте данных загрузочного модуля программы.

Адрес первого символа строкового литерала используется по-разному. Если литерал используется для инициализации указателя типа char*, адрес первого символа литерала будет начальным значением указателя. Если литерал используется в выражении в тех местах, где разрешается применять указатель, компилятор подставляет в выражение вместо литерала адрес первого символа. Например:

char *string1;

string1 = “Literal”;

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

  1. массива из символьных строк; char *otvet1[] = {”odin”, “dwa”};

#include <iostream.h>

#include <conio.h>

int main()   

{

char a[7] = "abcdef";  

cout <<sizeof(a)<< endl;    //размер строки равен 7

char string1 [] = "Minsk";   // нуль-символ добавляется к концу строки автоматически

cout << string1 << endl;      // Minsk

char string2 [6] = "Minsk";  // нуль-символ добавляется к концу строки автоматически

cout << string2 << endl;       // Minsk

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

cout << string3 << endl;     // Minsk

char *string4 = "Minsk";    // нуль-символ добавляется к концу строки автоматически

cout << string4 << endl;     // Minsk

char *string5;

string5 = "Literal";           // нуль-символ добавляется к концу строки автоматически

cout << string5 << endl;   // Literal

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

cout << otvet1[0] << endl;   // odin

cout << otvet1[1] << endl;   // dwa

getch();

return 0;

}

Пример:

#include <iostream.h>

int main()

   {

char str1[] = "Defined as an array";

char* str2 = "Defined as a pointer";

cout << str1 << endl;   

cout << str2 << endl;

// str1++;                  // нет, str1 –указатель-константа

str2++;                  // да, str2 – указатель-переменная

cout << str2 << endl;   

return 0;

   }

Инициализацию строки можно осуществить при ее описании: char stroka[6] = {’M’, ’i’, ’n’, ’s’, ’k’, ’\0’};     

char stroka[ ] = {’M’, ’i’, ’n’, ’s’, ’k’, ’\0’}; char stroka [6] = ”Minsk”;   //нулевой символ добавляется к концу строки автоматически; char stroka [ ] = ”Minsk”; 

char *string = ” Minsk”;

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

//пример 1

main ( )                                        // да, все правильно!!!

{char *name;

char msg[10];

name = (char*) malloc(10);       //инициализация указателя

printf (“ name?“);

scanf (“%s”, name);

strcpy (msg, “hello”);                   //инициализация строки как массива символов!!!

printf (“%s%s”, msg, name);

}

//пример 2

main ( )                                         // да, все правильно!!!

{char name[10];

char *msg;

printf (“ name?“);

scanf (“%s”, name);                      //инициализация строки как массива символов!!!

msg =  “hello”;

printf (“%s%s”, msg, name);

}

//пример 3

main ( )                                             // нет, есть ошибка

{char *name;

char msg[10];

printf (“ имя?“);

scanf (“%s”, name);                               //так нельзя,  указатель не проинициализирован!!!

msg =  “привет”;                                   // так нельзя, пытаемся изменить адрес массива!!!

printf (“%s%s”, msg, name);

}

Так как имя массива – это пример указателя-константы, то ошибкой будет попытка использовать его в некоторых операциях адресной арифметики. Например, нельзя выполнить такую «пересылку» строки символов в массив

Похожие материалы

Информация о работе

Тип:
Конспекты лекций
Размер файла:
368 Kb
Скачали:
0