Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Лекция. Символьные данные и строки.

 

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

Для символьных данных в С++ введен тип char. Описание символьных переменных:

char список_имен_переменных;

Например:

const char c='c';

//символ – занимает один байт, его значение не меняется

char a,b;

/*символьные переменные, занимают по одному байту,

значения меняются*/

const char *s="Пример строки\n";

//текстовая константа

Строка – это последовательность символов, заключенная в двойные кавычки (" ").

Размещая строку в памяти, транслятор автоматически добавляет в ее конце символ '\0' (нулевой символ или нулевой байт, который является признаком конца строки). В записи строки может быть и один символ: ”А” (заключен в двойные кавычки), однако, в отличие от символьной константы 'А' (используются апострофы), длина строки ”А” равна 2 байтам.

В языке С++ строка – это пронумерованная последовательность символов (массив символов), она всегда имеет тип char[]. Все символы строки нумеруются, начиная с нуля. Символ конца строки также нумеруется – ему соответствует наибольший из номеров. Таким образом, строка считывается значением типа «массив символов». Количество элементов в таком массиве на 1 больше, чем изображение соответствующей строки, так как в конец строки добавлен нулевой символ '\0' (рис. 1).

 

 

A \0   A
”А” строка (2 байта)   'А' символ (1 байт)

 

Рис.1 Представление строки и символа

 

Символьная строка в программном коде может располагаться на нескольких строках. Для переноса используется символ '\' с последующим нажатием клавиши ввод. Символ '\' игнорируется компилятором, и следующая строка считается продолжением предыдущей.

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

char s1[] = ”ABCDEF”; //инициализация строки

char s2[]={'A','B','C','D','E','F','\0'};//инициализация строки

Операция вычисления размера (в байтах) sizeof действует для объектов символьного типа и строк.

 

 

Вводить и выводить строки можно различными способами

Задача1.

#include <iostream>

using namespace std;

int main(){

const int n=80;

char s[n];

cin>>s;

cout<<s<<endl;

system("pause");

return 0;

}

 

 

 

 

 

Как видно из примера, при вводе целой строки выводится только первое слово. Это происходит из-за того, что ввод выполняется до первого пробельного символа(пробела, знака табуляции или символа перевода строки). Если во вводимой строке больше символов, чем может вместить выделенная для ее хранения область,то программа завершится аварийно.

Можно преобразовывать слова входной строки отдельные строковые переменные.

Задача2.

#include <iostream>

using namespace std;

int main(){

const int n=80;

char a[n],b[n],c[n],d[n];

cin>>a>>b>>c>>d;

cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;

system("pause");

return 0;

}

 

 

Если требуется ввести строку, состоящую из нескольких слов, в одну строковую переменную, используются методы getline или get класса istream, объектом которого является cin. Важно знать синтаксис вызова метода – после имени объекта ставится точка, а затем записывается имя метода.

Задача3.

#include <iostream>

using namespace std;

int main(){

const int n=80;

char s[n];

cin.getline(s,n);

cout<<s<<endl;

system("pause");

return 0;

}

 

Задача4.

#include <iostream>

using namespace std;

int main(){

const int n=80;

char s[n];

cin.getline(s,n);

cout<<s<<endl;

cin.get(s,n);

cout<<s<<endl;

system("pause");

return 0;

}

 

Метод getline считывает из входного потока (n-1) символов или менее, если символ перевода строки встретился раньше, и записывает их в строковую переменную s. Символ перевода строки также считывается (удаляется) из входного потока. Вместо символа перевода строки в строковой переменной размещается завершающий 0. Метод get работает аналогично, но оставляет в потоке символ перевода строки. В строковую переменную добавляется завершающий 0. Нельзя обращаться к методу get с двумя аргументами два раза подряд, не удалив \n из входного потока. Этот символ надо удалить из потока путем вызова get без параметров.

 
 


Задача5.

include <iostream>

using namespace std;

int main(){

const int n=80;

char s[n];

cin.get(s,n);

cin.get();

cout<<s<<endl;

cin.get(s,n);

cin.get();

cout<<s<<endl;

system("pause");

return 0;

}

 

Метод getline после прочтения строки не оставляет во входном потоке символ \n, поэтому лучше пользоваться им.

Если необходимо ввести несколько строк, то в некоторых случаях метод getline удобно использовать в заголовке цикла.

 

Задача6.

#include <iostream>

#include<string>

using namespace std;

int main(){

const int n=80;

char s[n];

while (cin.getline(s,n))

{

if (stricmp(s,"end")) // здесь может обрабатываться строка

{}

else { // прекращение ввода строк

system("pause");

return 0;}

cout<<s<<endl;}

system("pause");

return 0; }

 

 

Также можно использовать способ ввода-вывода строк языка С gets и puts.

 

Задача7.

#include <iostream>

#include<string>

using namespace std;

int main(){

const int n=80;

char s[n];

gets(s);

puts(s);

system("pause");

return 0; }

В том случае, если в одном операторе требуется вывести данные различных типов, то удобнее использовать функции printf и fprintf (вывод в файл). Если же работа выполняется только со строками, то следует использовать puts.

 

Задача8.

#include <iostream>

#include<stdio.h>

using namespace std;

int main(){

const int n=80;

char s[n];

int a;

float b;

gets(s);// ввод строки

scanf("%d%f",&a,&b); // ввод целого и вещественного числа

printf("%2d%25s%5.1f\n",a,s,b);

system("pause");

return 0; }

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...