КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Символьная информация и строкиДля символьных данных в Си++ введен тип char. Для представления символьной информации используются символы, символьные переменные и текстовые константы. Примеры: const char c=’c’; //символ – занимает один байт, его значение не меняется char a,b;//символьные переменные, занимают по одному байту, значения меняются const char *s=“Пример строки\n” ;//текстовая константа Строка в Си++ - это массив символов, заканчивающийся нуль-символом – ‘\0’ (нуль-терминатором). По положению нуль-терминатора определяется фактическая длина строки. Количество элементов в таком массиве на 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. Рассмотрим некоторые из этих функций:
Пример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. Функции в Си++ С увеличением объема программы становится невозможно удерживать в памяти все детали. Чтобы уменьшить сложность программы, ее разбивают на части. В Си++ задача может быть разделена на более простые подзадачи с помощью функций. Разделение задачи на функции также позволяет избежать избыточности кода, т. к. функцию записывают один раз, а вызывают многократно. Программу, которая содержит функции, легче отлаживать. Часто используемые функции можно помещать в библиотеки. Таким образом, создаются более простые в отладке и сопровождении программы.
|