В ходе лекции необходимо усвоить:
· Объявление строк и обращение к их элементам
· Инициализацию и ввод-вывод строк
· Операции над строками
· Связь строк с указателями
· Передачу строки в функцию в качестве параметра
· Обработку строк с использованием рекурсивных функций
В С++ отсутствует специальный строковый тип, и используется два вида строк:
• строка как массив символов типа 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 использованием:
const char str[n] ="dwa";
При этом идентичными являются следующие описания массива:
char string1 [] = “Minsk”;//нуль-символ добавляется к концу строки автоматически; char string2 [6] = “Minsk”;
char string3 [6] = {‘M’, ‘i’, ‘n’, ‘s’, ‘k’, ‘\0’};
Если строковый литерал применяется для инициализации массива типа char, адрес первого символа литерала становится синонимом имени массива. Переменная-указатель string4 получает начальное значение, равное адресу первого элемента (символ ‘M’) строкового литерала. Сам литерал в формате ASCIIZ-строки располагается в сегменте данных загрузочного модуля программы.
Адрес первого символа строкового литерала используется по-разному. Если литерал используется для инициализации указателя типа char*, адрес первого символа литерала будет начальным значением указателя. Если литерал используется в выражении в тех местах, где разрешается применять указатель, компилятор подставляет в выражение вместо литерала адрес первого символа. Например:
char *string1;
string1 = “Literal”;
Важно осознать, что при выполнении операции присваивания в ячейку памяти, отведенную для указателя string1, пересылается не массив символов, а только указатель на его начало, т.е. адрес первого символа литерала.
#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);
}
Так как имя массива – это пример указателя-константы, то ошибкой будет попытка использовать его в некоторых операциях адресной арифметики. Например, нельзя выполнить такую «пересылку» строки символов в массив
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.