}
6
Практическая работа № 1. Работа со строковыми символами.
1.
Цель работы
: Формирование навыков работы со строковыми
символами, функциями и указателями при обработке массивов.
2.
Теоретическая часть.
Строкой называется последовательность символов, ограниченная
символом с кодом 0, то есть '\0'. Из определения видно, что она является
объектом переменной размерности. Местом хранения строки является массив
символов. Суть взаимоотношений между строкой и массивом символов
состоит в том, что строка является структурой данных, а массив –
переменной:
Строка хранится в массиве символов, массив символов может быть
инициализирован строкой или может быть заполнен программным путём:
char A[20] = { 'С','т','р','о','к','а','\0' };
char B[80];
for (int i=0; i<20; i++) B[i] = 'A';
B[20] = '\0';
Строка представляет собой последовательность, ограниченную
символом '\0', поэтому работать с ней нужно в цикле, ограниченном не
размерностью массива, а условием обнаружения символа конца строки:
for (i=0; B[i] !='\0'; i++)...
Соответствие размерности массива и длины строки транслятором не
контролируется, за это несёт ответственность программа (программист):
char C[20],B[]=”Строка слишком длинная для C”;
// следить за переполнением массива
// и ограничить строку его размерностью
for (i=0; i<19 && B[i]!='\0'; i++) C[i] = B[i];
C[i]='\0';
}
7
В языке С нет специального типа данных для строковых переменных.
Для этих целей используются массивы символов (тип char). Следующий
пример демонстрирует использование строк в программе:
char str_1[100] = {‘П’,’р’,’и’,’в’,’е’,’т’,’\0’};
char str_2[100] = “Привет”;
char str_3[] = “Привет”;
printf(“%s\n%s\n%s\n”,str_1,str_2,str_3);
В приведённом примере показаны три способа инициализации строковых
переменных. Первый способ является классическим объявлением массива,
второй и третий используются специально для строк. Причём в последнем
случае, компилятор сам определяет нужную длину массива для записи
строки.
Символ ‘\0’ означает в языке С конец строки и все символы после него
игнорируются как символы строки.
Функции ввода строк
scantf(“%s”, имя строковой переменной);
gets(имя строковой переменной);
Функции вывода символа
printf(“%s”, имя строковой переменной);
puts(имя строковой переменной);
Для работы со строками можно использовать библиотеку стандартных
функций , в которой имеются следующие функции работы со
строками:
1. Объединение строк или конкатенация-strcat(имя строки1, имя строки2);
2. Замена содержимого одной строки содержимым другой
strcpy(имя строки1, имя строки2);
3. Нахождение числа символов в строке-strlen(имя строки);
4. Сравнение Строки 1 и Строки 2-strcmp(имя строки1, имя строки2);
Возвращает 0, если строки равны, число меньше нуля, если Строка 1<Строка
2 и число больше нуля, если Строка 1>Строка2.
}
8
5. Преобразование строчных символов строки в прописные (обрабатывает
только буквы латинского алфавита)-strlwr(имя строки);
6. Преобразование прописных символов строки в строчные (обрабатывает
только буквы латинского алфавита)-strupr(имя строки);
7. Заполнение строки указанным при вызове функции символом
strset(имя строки, имя символа);
8. Поиск символа в строке. (Возвращает указатель на первый найденный
символ или, если символ не найден – NULL.)
strchr(имя строки, имя символа);
Функции в языке СИ оформляются следующим образом:
/* прототип функции */
long func(int, int, int*);
/ * описание функции * /
long func (a, b, с) // заголовок
int a,b,*с; // описание формальных параметров
{ long х; // описание локальных переменных
. . . // тело функции
*с=3; // возврат результата по ссылке
return x; // возврат результата через имя функции
}
/* вызов функции */
main()
{
long r; int i, j, k; // описание локальных переменных
. . .
r = func (i, j, &k); // вызов
}
Указатель в СИ – переменная, содержащая адрес другой переменной.
Указатели должны быть описаны в виде
int *ip; // указатель на int
}
9
float *fp; // указатель на float
При работе с указателями используются унарные операции:
– обращение по адресу,
& – получение адреса.
Таким образом, можно записать
int x, *ip; // описания переменных
ip=&x; // присвоение адреса
*ip=3; // обращение по адресу
Если указателю присвоен адрес элемента массива, его можно использовать
так же, как и имя массива. Следующие обращения к третьему элементу
массива s полностью эквивалентны:
int s[10], *p;
p=s; s[3]=0; // вариант 1
p[3]=0; // вариант 2
*(p+3)=0; // вариант 3
Операции инкремента (++) и декремента (––) изменяют указатель так, что он
будет указывать на соседний элемент данных такого же типа. Например, если
fp – указатель на float, операция fp++ увеличит fp на 4, т. е. на количество
байт, занимаемых элементом типа float.
19> Do'stlaringiz bilan baham: |