Студопедия

КАТЕГОРИИ:


Архитектура-(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]);

Объем оперативной памяти для указателей и строк определяется следующим образом:

  1. для символьных массивов с явными границами выделяется память, равная количеству запрошенных по описанию символов;
    char s1[10]=”строка1”;
  2. для символьных массивов, у которых границы не указаны, выделяется оперативная память по количеству символов инициализируемой строки;
    char s2[]=”строка2”;
  3. если задан скалярный указатель на данные типа char и инициализировано значение строки, оперативная память выделяется для указателя и для значения строки
    char *s3 = “строка3”;
  4. для неинициализированного скалярного указателя выделяется оперативная память только для самого указателя. Выделить память для строки и сформировать значение указателя можно, используя malloc, или присваивая указателю адрес конкретной строки
    char *s4 ;
    s4=(сhar) malloc(20*sizeof(char)); или
    s4=”строка”;
  5. для массива указателей с заданным количеством элементов и инициализированными значениями строк память выделяется для массива указателей и для значений строк
    char *s5[3]={“home”, “sun”, “cat”}
  6. для массива указателей, у которого количество элементов не задано, но значения строк инициализированы, память выделяется для массива указателей по количеству инициализированных строк
    char *s6[]={“home”, “sun”, “cat”}
  7. для массива указателей с заданным количеством элементов, в котором значения строк не инициализированы, память выделяется только для указателей
    char *s7[4];

При объявлении символьного массива без использования указателей, имя массива является указателем-константой, поэтому его нельзя изменять, например нельзя присваивать 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; Просмотров: 383; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.