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

Обработка символьных и строковых данных




 

Символьный тип – это тип данных, используемый для описания отдельных символов (знаков, букв, кодов). Традиционная запись символьного значения представляет собой символ, заключенный в апострофы, например ‘a’.

Строковая константа представляет собой последовательность символов, заключенную в кавычки (“), например, “это моя первая строка”. В конце каждого строкового типа данного компилятором добавляется нулевой символ, представляемый управляющей константой \0.

Строковая переменная описывается как char st[12], в квадратных скобках указывается длина строки. Это означает, что строковая переменная – массив символов, причем нумерация элементов массива начинается с нуля, и число элементов массива равно числу символов плюс единица.

Операция конкатенации строк обозначается обратной косой чертой:

“Это очень длин\

ная строка символов”

Для описания строковой переменной можно воспользоваться понятием массива символов или указателя (ссылки) на массив символов, например:

char mas[15]; char*st;

Для ввода/вывода символьных/строковых типов данных можно воспользоваться не только функциями printf() и scanf(), но и рядом других функций, прототипы которых описаны библиотечном файле stdio.h:

- функция int putchar(char c) выводит одиночный символ в стандартный выходной поток stdout без последующего перехода к новой строке.

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

char ch;

ch=getchar();

putchar(ch);

- функция int puts(char *st) используется для вывода строки символов в стандартный выходной поток. Строка символов дополняется символом конца строки ‘\n’, и после вывода строки символов функцией puts() переход к новой строке происходит автоматически.

Пример.

#include<stdio.h>

void main()

{char mas[15], *st;

….

puts(mas); puts(st);

}

- функция char *gets(char *st) выполняет считывание из стандартного входного потока. Ввод продолжается до тех пор, пока не будет нажата клавиша Enter. Эта функция дополняет строку введенных символов символом ‘\0’.

Пример.

#include<stdio.h>

void main()

{char mas[15], *st;

….

gets(mas); gets(st);

}

Если число представлено в виде строки символов, то можно воспользоваться функциями int atoi (строка символов), long atoll (строка символов), double atof (строка символов) для преобразования строки, соответственно в целое, длинное целое или вещественное число. Прототипы этих функций описаны в библиотечном файле stdlib.h. Если строка не может быть преобразована в число, то возвращается нуль.

В языке С++ существует группа операторов для работы с символьными переменными (табл. 8), которые описаны в загрузочном файле ctype.h.

Таблица 8

Операторы, для работы с символьными переменными

Синтаксис Описание
isalpha(c) Функция проверяет, является ли символ с буквой
isdigit(c) Функция проверяет, является ли символ с цифрой
islower(c) Функция проверяет, является ли символ с строчной буквой
isspace(c) Функция проверяет, является ли символ с пустым символом (пробел, табуляция или новая строка)
isupper(c) Функция проверяет, является ли символ с прописной буквой
isalnum(c) Функция проверяет, является ли символ с алфавитноцифром (буква или цифра)
isascii(c) Функция проверяет, является ли символ с кодом ASCII(0-127)
iscntrl(c) Функция проверяет, является ли символ с управляющим символом
ispunct(c) Функция проверяет, является ли символ с знаком пунктуации
toupper(c) Функция преобразует символ с в прописную букву
tolower(c) Функция преобразует символ с в строчную букву

 

Для работы со строкой символов в файле string.h описаны прототипы ряда функций. Библиотека представляет возможности копирования (strcpy, strncpy), сравнения (strcmp, strncmp), объединения строк (strcat, strncat), поиска подстроки (strstr), поиска вхождения символа (strchr, strrchr, strpbrk), определения длины строки (strlen) и т.д., а также содержит специальные функции ввода строк и отдельных символов с клавиатуры и из файла.

Пример.

#include <stdio.h>

#include <string.h>

void main()

{char s[80], passw[]}=”kuku”; // passw – эталонный пароль.

// Можно описать как *passw=”kuku”

int i, k=0;

for(i=0;!k && i<3; i++)

{printf(“Введите пароль: \n”);

gets(s); // функция ввода строки

if (strstr(s,passw)) k=1; // функция сравнения строк

}

if (k) printf(“\n Пароль принят”);

else printf(“\n Пароль не принят”);

return 0;

}

 

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

char scr[10], dest[10];

for(int i=0;i<=strlen(scr); i++) dest[i]=scr[i];

 

Лабораторная работа 6

УКАЗАТЕЛИ

 

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

Пример.

int *rt; float *s; void *s_p;

указатель типа void («пустой») может указывать на объект любого типа.

Наиболее важными операциями, связанными с указателями, являются операция обращения по адресу * (разыменования или снятия ссылки) и операция определения адреса &. Первая операция служит для присваивания или считывания значений переменной, на которую ссылается данный указатель. Вторая операция возвращает адрес памяти своего операнда. Размер возвращаемого адреса зависит от применяемой модели динамической памяти.

Пример.

#include <stdio.h>

void main ()

{int i=10, s, *x, *f, *v=&i, *x=9,s=5,f=&s;

printf (“\n Размер x=%d”, sizeof(x));

printf (“\n Значение указателей x=%u v=%u &i=%u”, x, v, &i);

printf (“\n Значение по адресу x=%d”, *x);

printf (“\n Адрес s=%u”, &s);

}

При работе с динамическими переменными типа указатель распространенной ошибкой является то, что при описании указатель не инициализируется, что приводит к тому, что компилятор резервирует память только для хранения адреса. В примере, приведенном выше, под переменные *х и *f отводится только два байта под хранение адреса и не отводится два байта под хранение переменной типа int. Что может привести к попытке размещения в процессе выполнения программы значения переменной по начальному адресу, связанному с какой-либо частью операционной системы.

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

1. Предварительно инициализировать указатель, т.е. присвоить указателю адрес предварительно инициализированной переменной, как это выполнено в примере для указателя *v.

2. Использовать функции распределения динамической памяти – «кучи», описанные в библиотечном файле alloc.h:

- void *malloc(unsigned s) – выделение памяти размером s байт;

- void *calloc (unsigned nel, unsigned els) – выделение памяти для nel элементов, для которых размер каждого элемента определяется переменной els,

- void *realloc(void *blok, unsigned s) – изменение размера ранее выделенной памяти для блока *block до величины s байт;

- void far *farcalloc(unsigned long nel, unsigned long els) – выделение памяти для дальней ее модели из nel элементов, где размер каждого элемента els;

- void free (void *blok) – освобождение ранее выделенной памяти.

Все функции имеют тип void, поэтому они совместимы с указателями любого типа и справедлива запись x=(int*)malloc(sizeof(int)), т.е. адрес, выдаваемой функцией malloc, связывается с типом int. Данные функции гарантируют, что переменной-указателю не присваивается адрес, используемой системой.

Пример. Вычислить сумму n элементов массива вещественного типа.

# include <stdio.h>

# include <alloc.h>

void main()

{float *a, s=0, *prn, f;

int i, n;

printf (“Введите размер массива а \n”);

scanf(“%d”,&n);

a=(float *)malloc(n*sizeof(float));

if (a==0) {printf (“No memory”); exit (1);}

else {ptr=a; printf(“Input array a \n”);

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

{scanf(“%f”, ptr); f=*ptr; s+=f; ptr++;}

printf (“s=%e\n”, s);

}

free(a);

}

 

Лабораторная работа 8

Поделиться:





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



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