КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Строки
Лекция 7 Символьные переменные бывают: ü char – знаковые переменные (-128.. +127); ü unsigned char – беззнаковые переменные (0.. 255) Символьные константы: const a=’A’, y=’1’, e=’\’’; //если задается апостроф, то перед ним ставится \. Символьные переменные: char s1=’S’, s2=’5’, s3=’\\’; //если задается символ \, то перед ним ставится \. Строка – это одномерный массив символов. Константы строки должны заканчиваться символом \0. Инициализация одного и того же символьного массива: char c[]={‘п’,’р’,’и’,’м’,’е’,’р’,’\0’); charc[]=”пример”; char[7]=”пример”; char *c=”пример”; В С++ в константы разрешено вносить символы управления печатью, например: char *c=”текст \n на двух строках”; char*c=”\07 звонок”; Описывая строки при помощи указателя, необходимо следить за ходом выделения памяти. char a[20]; char *b; scanf(“%s”,a); scanf(“%s”,b); последний оператор не верен, т.к. с переменной необходимо сначала связать некоторый участок памяти (либо присвоить адрес уже определенного символьного массива, либо выделить память функцией malloc ()). Функция print() со спецификатором %с выводит один символ на экран. Функция scanf() со спецификатором %с читает один символ. Пусть вводится предложение, слова в котором разделены пробелами, в конце точка. По окончании ввода удалить из предложения все повторяющиеся пробелы. char z,s; printf("\n введите строку > "); for (z=s=' ';z!='.';s=z) { scanf("%c",&z); if(z==' ' && s==' ') continue; printf("%c",z); } Функция getchar() читает из входного потока по одному символу за обращение. Пусть вводится предложение, слова в котором разделены пробелами, в конце точка. Посчитать общее количество символов, отличных от пробела. int k; char z; printf("\n введите строку"); for (k=0;(z=getchar())!='.';) if(z!=' ') k++; printf("\n %d", k);
Функция putchar() – выводит символ на экран: putchar(z); Функция gets() – вводит строку с клавиатуры до символа \0 Функция puts() – вывод строку на экран. Пусть требуется переписать введенную с экрана строку в символьный массив. int k; char z[20],s[20]; printf("\n vv stroky"); gets(z); for (k=0;z[k]!='\0';k++) s[k]=z[k]; s[k]='\0'; puts(s); Для работы со строками используется <string.h> size_t strlen(char *st) – функция возвращает длину строки (без учета символа завершения строки) char *strcat(char *s1, char *s2) – функция добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ int *strcmp(char *s1, char *s2) – сравнение двух строк и возвращает отрицательное (если s1<s2), нулевое (если s1=s2) или положительное (если s1>s2) char *strcpy(char *s1, char *s2) – копирование одной строки (orig) в другую (copy) char *strchr(char *s, int ch) – ищет символ в строке и возвращает указатель на первое вхождение символа в строку (если нет, то возвращает NULL) char *strtok(char *s1, char *s2) – возвращает следующую лексему из s1, отделенную любым из символов из набора s2
Пусть требуется ввести с экрана 3 строки и записать их в виде массива символов. int i; char z[3][20]; for (i=0;i<3;i++) { printf("\n vv stroky"); gets(z[i]); } for (i=0;i<3;i++) puts(z[i]); Объем оперативной памяти для указателей и строк определяется следующим образом:
При объявлении символьного массива без использования указателей, имя массива является указателем-константой, поэтому его нельзя изменять, например нельзя присваивать s1=s2; или s1++; При объявлении символьных массивов с помощью указателя, имя указателя является переменной, поэтому его можно использовать в выражениях и операторах присваивания. Ввод и вывод строк. В задачах системного программирования часто возникает необходимость обработки строк неопределенной длины. Пусть требуется выделить память для символьного массива. char *c=(char*)malloc(10*sizeof(char)); scanf(“%9c”,c); c[9]=’\0’; //выступает ограничителем строки или использование \n в спецификации формата ввода. printf(“%s\n”,c); Если во время ввода организовать цикл, то введенная длинная строка разрезается на строки заданной длины. char * c=(char *)malloc(10*sizeof(char)); for(int i=0; i<3;i++) { scanf(“%9с”,c); c[9]=’\0’; printf(“%s\n”,c); } //можно ввести длинную строку, а выведутся 3 строки по 10 символов, независимо от введенных данных.
Свободные массивы строк. Свободный массив – это двумерный массив (матрица), размер каждой строки которого может быть разным. Свободные массивы формируются с помощью массивов указателей. Массивы указателей могут быть статические и динамические. char *month[] = {“january”, “february”, “march”}; void main(void) { static char *name[] = {“Ann”, “Mike”, ”Dan”, “Nick”}; char *name_list[20]; } Количество элементов внешнего массива указателей month и локального name определяются количеством инициализированных строк, а количество элементов одномерного массива name_list задано явно. Для одномерного массива указателей, каждый указатель содержит адрес начала соответствующей символьной строки. Программа вводит с клавиатуры свободный массив строк, распечатывает его и выводит на экран. Для работы со строками используется <string.h> void main(void) { int k, res; // k-количество строк динамического массива char *str, *tab[10]; //tab – массив указателей на строки printf(“\n введите количество вводимых имён - ”); scanf(“%d”,&k); for(int i=0;i<k;i++) { print(“\n введите имя - ”); res=scanf(“%s”,str); if (res==1) //res – определяет успех ввода строки { tab[i]=(char*)malloc(strlen(str)+1); strcpy(tab[i],str); // копирует из одной строки в другую } } for(i=0;i<k;i++) { printf(“%s”,tab[i]); free(tab[i]); } //ошибка free(str); } Для ввода значений динамического свободного массива строк используется динамический массив указателей. char *str=(char*) malloc(80); char **tab; printf(“\n введите количество вводимых фамилий - ”); scanf(“%d”,&k); tab=(char**)malloc(k*sizeof(char*)); // далее аналогично предыдущему примеру.
Дата добавления: 2014-01-06; Просмотров: 407; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |