Символьная информация и строки

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

Примеры:

const char c=’c’; //символ – занимает один байт, его значение не меняется

char a,b;//символьные переменные, занимают по одному байту, значения меняются

const char *s=“Пример строки\n” ;//текстовая константа

Строка в Си++ - это массив символов, заканчивающийся нуль-символом – ‘\0’ (нуль-терминатором). По положению нуль-терминатора определяется фактическая длина строки. Количество элементов в таком массиве на 1 больше, чем изображение строки.

 

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

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

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

Пример

void main()

{

char s1[10]="string1";

int k=sizeof(s1);

cout<<s1<<"\t"<<k<<endl;

char s2[]="string2";

k=sizeof(s2);

cout<<s2<<"\t"<<k<<endl;

char s3[]={‘s’,’t’,’r’,’i’,’n’,’g’,’3’}

k=sizeof(s3);

cout<<s3<<"\t"<<k<<endl;

char *s4="string4";//указатель на строку, ее нельзя изменить

k=sizeof(s4);

cout<<s4<<"\t"<<k<<endl;

 

 

}

Результаты:

string1 10 – выделено 10 байтов, в том числе под \0

string2 8 – выделено 8 байтов (7+1байт под \0)

string3 8 – выделено 8 байтов (7+1байт под \0)

string4 4 – размер указателя

 

Примеры:

char *s=”String5”; - выделяется 8 байтов для строки

char*ss; - описан указатель

ss=”String6”;//память не выделяется , поэтому программа может закончиться аварийно.

char *sss=new char[10];//выделяем динамическую память

strcpy(sss,”String7”);//копируем строку в память

 

Для ввода и вывода символьных данных в библиотеке языка СИ определены следующие функции:

int getchar(void) - осуществляет вод одного символа их входного потока, при этом она возвращает один байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.

int putchar (int c) – помещает в стандартный выходной поток символ c.

char* gets(char*s) – считывает строку s из стандартного потока до появления символа ‘\n’, сам символ ‘\n’ в строку не заносится.

int puts(const char* s) записывает строку в стандартный поток, добавляя в конец строки символ ‘\n’, в случае удачного завершения возвращает значение больше или равное 0 и отрицательное значение (EOF=-1) в случае ошибки.

Примеры:

1. char s[20];

cin>>s;//ввод строки из стандартного потока

cout<<s;//вывод строки в стандартный поток

Результат работы программы:

При вводе строки “123 456 789”, чтение байтов осуществляется до первого пробела, т. е. в строку s занесется только первое слово строки “123/0”, следовательно, выведется: 123.

2. char s[20];

gets(s);//ввод строки из стандартного потока

puts(s);//вывод строки в стандартный поток

Результат работы программы:

При вводе строки “123 456 789”, чтение байтов осуществляется до символа ‘\n’, т. е. в s занесется строка”123 456 789\n\0”, при выводе строки функция puts возвращает еще один символ ‘\n’, следовательно, будет выведена строка “123 456 789\n\n”.

3. char s[20];

scanf(“%s”,s);//ввод строки из стандартного потока

printf(“%s”,s);//вывод строки в стандартный поток

Результат работы программы:

При вводе строки “123 456 789”, чтение байтов осуществляется до первого пробела, т. е. в строку s занесется только первое слово строки “123/0”, следовательно, выведется: 123. Т. к. s – имя массива, т. е. адрес его первого элемента, операция & в функции scanf не используется.

Для работы со строками существуют специальные библиотечные функции, которые содержатся в заголовочном файле string.h. Рассмотрим некоторые из этих функций:

Прототип функции Краткое описание Примечание
unsigned strlen(const char*s); Вычисляет длину строки s.  
int strcmp(const char*s1, const char *s2); Сравнивает строки s1 и s2. Если s1<s2, то результат отрицательный, если s1==s2, то результат равен 0, если s2>s1 – результат положительный.
int strcnmp(const char*s1, const char *s2); Сравнивает первые n символов строк s1 и s2. Если s1<s2, то результат отрицательный, если s1==s2, то результат равен 0, если s2>s1 – результат положительный.
char*strcpy(char*s1, const char*s2); Копирует символы строки s1 в строку s2.  
char*strncpy(char*s1, const char*s2, int n); Копирует n символов строки s1 в строку s2. Конец строки отбрасывается или дополняется пробелами.
char*strcat(char*s1, const char*s2); Приписывает строку s2 к строке s1  
char*strncat(char*s1, const char*s2); Приписывает первые n символов строки s2 к строке s1  
char*strdup(const char*s); Выделяет память и переносит в нее копию строки s При выделении памяти используются функции

Пример1:

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

#include <stdio.h>

#include <string.h>

void main()

{

char s[250], //исходная строка

w[25], //слово

mas[10][25];//массив слов

puts(“\nвведите строку”);

gets(s);

int k=0,t=0,i,len,j;

len=strlen(s);

while(t<len)

{

for(j=0,i=t;s[i]!=’ ‘;i++,j++)w[j]=s[i];//формируем слово до пробела

w[j]=’/0’;//формируем конец строки

strcpy(mas[k],w);//копируем слово в массив

k++;//увеличиваем счетчик слов

t=i+1;//переходим к следующему слову в исходной строке

}

strcpy(s,””);//очищаем исходную строку

for(t=0;t<k;t++)

if(mas[t][0]<’0’&&mas[t][0]>’9’)//если первый символ не цифра

{

strcat(s,mas[t]);//копируем в строку слово

strcat(s,” “);//копируем в строку пробел

}

puts(s);//выводим результат

}

Пример2:

Сформировать динамический массив строк. Удалить из него строку с заданным номером.

#include <iostream.h>

#include <string.h>

void main()

{

int n;

cout<<"\nN=?";cin>>n;

char s[100];

char**matr=new char*[n];

for(int i=0;i<n;i++)

{

cout<<"\nS=?";

cin>>s;

matr[i]=new char[strlen(s)];

strcpy(matr[i],s);

}

for(i=0;i<n;i++)

{

cout<<matr[i];

cout<<"\n";

}

int k;

cout<<"\nK=?";

cin>>k;

if(k>=n){cout<<"There is not such string\n";return;}

char **temp=new char*[n-1];

int j=0;

 

for(i=0;i<n;i++)

if(i!=k)

{

temp[j]=new char[strlen(matr[i])];

strcpy(temp[j],matr[i]);

j++;

}

 

n--;

for(i=0;i<n;i++)

{

cout<<temp[i];

cout<<"\n";

}

}


 

11. Функции в Си++

С увеличением объема программы становится невозможно удерживать в памяти все детали. Чтобы уменьшить сложность программы, ее разбивают на части. В Си++ задача может быть разделена на более простые подзадачи с помощью функций. Разделение задачи на функции также позволяет избежать избыточности кода, т. к. функцию записывают один раз, а вызывают многократно. Программу, которая содержит функции, легче отлаживать.

Часто используемые функции можно помещать в библиотеки. Таким образом, создаются более простые в отладке и сопровождении программы.








Дата добавления: 2015-08-26; просмотров: 746;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.019 сек.