Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++.doc
Скачиваний:
27
Добавлен:
20.08.2019
Размер:
2.26 Mб
Скачать

Функции работы со строками

Функции для обработки срок работают, проходя по строке символ за символом до тех пор, пока не встретится нулевой символ.

Вывод строки символов:

cout <<SM2<<SM3<<SM4;//выведет каждый раз FILES, т.к. встретит нулевой символ и на этом остановится. Вывод работает как со скалярной переменной.

cout <<SM1; //будет выводить бесконечно, т.к. будет двигаться по памяти, выводя байт за байтом, интерпретируя каждый из них как символ, подлежащий печати, пока не встретит нулевой символ.

Ввод строки символов:

Класс istream включает функцию-член get(), которая читает ввод до конца строки, заменяет его нулевым символом при сохранении строки, но вместо того, чтобы прочитать и отбросить символ перевода строки на новую, get() оставляет его во входной очереди. Предположим это и используем два вызова get():

#include <iostream>

using namespace std ;

int main ( )

{

char SM2 [100 ],SM3[100];

cin.get(SM2,100);

cin.get(SM3,100);

return 0 ;

}

Поскольку код клавиши ENTER (#13) состоит из двух частей:

1: - признак конца строки;

2: - перевод на новую строку;

первый вызов оставляет символ перевода на новую строку во входной очереди. Символ новой строки оказывается первым символом, который видит следующий вызов. Т.о. второй вызов get() читает символ новой строки и завершает чтение, не прочтя необходимое. На помощь приходит вызов cin.get() без аргументов читает единственный следующий символ, даже если он будет символ новой строки, т.е. следующая последовательность будет работать правильно.

char SM2 [100 ],SM3[100];

cin.get(SM2,100); //читает првую строку

cin.get(); //читает символ перевода строки

cin.get(SM3,100); //читает вторую строку

Другой способ применения состоит в канкатинации двух вызовов функций-членов класса, как показано в следующем примере:

Пример ввода-вывода строк

#include <iostream>

using namespace std ;

int main ( )

{

// объявление и инициализация строки

char SM [ ] = "FILES" ;

cout<<SM<<"\n";

char SM2 [100 ],SM3[100];

cin.get(SM2,100).get();//ввод строки

cout<<SM2<<'\n';

cin.get(SM3,100).get();//ввод строки

cout<<SM3<<'\n';

strcat(SM2,SM3);

printf("\nVVV = %s",SM2);

return 0 ;

}

Действия, производимые над строками и их правила Присвоение

Механизм строковых назначений имеет некоторые особенности, обусловленные соответствием длин строк получателя и источника:

- если длина получателя равна длине источника, то значение источника целиком помещается в получателя;

- если максимальная длина получателя превышает текущую длину источника, все содержимое источник попадает в получатель и ткущая длина получателя становится равной текущей длине источника;

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

Конкатенация строк

Формат:

char *strcat(char* ST1, const char* ST2);

Объединение строки ST1 и ST2 ,результат записывается в строку ST1.

При конкатенации надо побеспокоится, чтбы приемник принял сумму длин текущих источников.