- •Рецензенты:
- •Лекция 1 Основные понятия языка с
- •Первая программа
- •Переменные языка с
- •Имя переменной
- •Объявление константы
- •Операции языка с
- •Лекция 2 Операторы языка с Условный оператор
- •Оператор безусловного перехода
- •Оператор switch
- •Циклы Цикл for
- •Циклы while и do-while
- •Использование операторов break, continue и goto в циклах
- •Операция условие ?
- •Лекция 3 Массивы
- •Инициализация массивов
- •Массивы символов. Строки
- •Функции для работы со строками
- •Лекция 4 Указатели
- •Объявление указателей
- •Операции над указателями
- •Связь указателей и массивов
- •Массивы указателей
- •Инициализация указателей
- •Лекция 5 Функции языка с
- •Объявление функции
- •Оператор return
- •Прототипы функций
- •Функции c произвольным числом параметров
- •Область действия и область видимости переменной
- •Классы памяти
- •Параметры и аргументы функции
- •Лекция 6 Типы, определяемые пользователями
- •Структура
- •Перечислимый тип
- •Переименование типов-typedef
- •Лекция 7 Модели памяти и препроцессор языка с Модели памяти
- •Препроцессор языка с
- •Директива #define
- •Список рекомендуемой литературы
- •Оглавление
- •Программирование на языках высокого уровня: с
- •428015 Г.Чебоксары, Московский просп., 15
Массивы символов. Строки
Массивы типа char - символьные массивы - занимают в языке особое место. Во многих языках есть специальный тип данных - строка символов (string). В языке С отдельного типа строки символов нет, а реализована работа со строками путем использования одномерных массивов типа char. В языке С символьная строка - это одномерный массив типа char, заканчивающийся нулевым байтом. Нулевой байт - это байт. каждый бит которого равен нулю. Для нулевого байта определена специальная символьная константа '\0'. Это следует учитывать при описании соответствующего массива символов. Так, если строка должна содержать N символов, то в описании массива следует указать N+1 элемент. Например, описание char str[11]; предполагает, что строка содержит 10 символов, а последний байт зарезервирован под пулевой байт. Задан обычный одномерный массив, но если трактовать его как строку символов, то это будет строка максимум из 10 элементов.
Хотя в языке С нет специального типа строки, язык допускает строковые константы. Строковая константа - это список литер, заключенных в двойные кавычки. Например, "Borland C++", "Это строковая константа".
В конец строковой константы не надо ставить символ '\0'. Это сделает компилятор, и строка "Borland C++" в памяти будет выглядеть так:
|В|о|г|l|a|n|d||С|+|+|\0|
Есть два простых способа ввести строку с клавиатуры. Первый способ -воспользоваться функцией scanf() со спецификатором ввода %s. Надо помнить, что функция scanf() вводит символы до первого пробельного символа. Второй способ - воспользоваться специальной библиотечной функцией gets(), объявленной в файле stdio.h. Функция gets() позволяет вводить строки, содержащие пробелы. Ввод оканчивается нажатием клавиши Enter. Обе функции автоматически ставят в конце строки нулевой байт. Не забудьте зарезервировать для него место. В качестве параметра в этих функциях используется просто имя массива.
Вывод строк производится функциями printf() или puts(). Обе функции выводят содержание массива до первого нулевого байта. Функция puts() добавляет в конце выводимой строки символ новой строки. В функции printf() переход на новую строку надо предусматривать в строке формата самим.
Программа 3.2:
#include <stdio.h>
/* Ввод строки с клавиатуры */
void main() {
char str[80]; /* Зарезервировали место для строки */
printf( "ведите строку длиной менее 80 символов: ");
gets(str); /* читает строку, пока не нажмете клавишу Enter */
puts(str);
printf("Введите еще одну строку длиной менее 80 символов: ");
scanf("%s",&str); /* читает строку, пока не встретится пробел */
puts(str); }
Функции для работы со строками
Для работы со строками существует специальная библиотека, описание которой находится в файле string.h, то есть в начале программы нужно написать #include <string.h>.
Наиболее часто при работе со строками используются функции strcpy(), strcat(), strlen(), slrcmp() этой библиотеки. Рассмотрим их более подробно.
Синтаксис использования функции strcpy() следующий:
char *strcpy(char *dest, const char *src);
При этом происходит копирование одной строки (src) в другую (dest). Функция strcpy возвращает значение dest. Например:
strcpy(sl. s2);
Функция strcpy() используется для копирования содержимого строки s2 в строку sl. Массив sl должен быть достаточно большим, чтобы в него поместилась строка s2. Если мало, компилятор не выдает указания на ошибку или предупреждения. Это не прервет выполнения программы, но может привести к порче других данных или самой программы и неправильной работе программы в дальнейшем.
Синтаксис использования функции strcat() имеет вид
char *strcaе(char *sl, const char *s2);
Функция strcat() присоединяет строку s2 к строке sl и помещает ее в массив, где находилась строка sl, при этом строка s2 не изменяется. Нулевой байт, который завершал строку sl, будет заменен первым символом строки s2. И в функции strcpy(), и в функции strcat() получающаяся строка из автоматически завершается нулевым байтом.
Программа 3.3:
#include<string. h>
#include<stdio.h.>
int main(void) {
char destination[25];
char *blank=" ", *c = "C++", *Borland = "Borland";
strcpy(destination, Borland);
gtrcat(destination, blank);
strcat(destination, c);
printf("%s\n", destination);
return 0; }
Синтаксис использования функции strcmp() имеет вид
int strcmp(const char *sl, const char *s2);
Функция strcmp сравнивает строки sl и s2 и возвращает значение 0, если строки равны, то есть содержат одно и то же число одинаковых символов. Под сравнением строк понимается сравнение в лексикографическом смысле, так, как это происходит, например, в словаре. Конечно, в функции происходит посимвольное сравнение кодов символов. Код первого символа одной строки сравнивается с кодом второй строки. Если они равны, рассматриваются вторые символы, и т. д. Если sl лексикографически (в смысле словаря) больше s2, то функция slrcmp() возвращает положительное число, если меньше - отрицательное значение.
Программа 3.4:
#include<string.h>
#include<stdio.h>
int main(void){
char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";
inl ptr:
pir =slrcmp(buf2. huf1);
if(рtr>0)
printf("buffer 2 is greater than buffer 1\n");
else
printf(“buffer 2 is less than buffer l\n");
ptr=strcmp(buf2, buf3);
if (ptr>0)
printf("buffer 2 is greater than buffer 3\n");
else
printf(“buffer 2 is less than buffer 3\n");
return 0:}
Вызов функции strlen() имеет вид
int l= strlen(s);
Функция strlen() возвращает длину строки s, при этом завершающий нулевой байт не учитывается. Вызов length("Hello") вернет значение 5.
Синтаксис использования функции strchr() имеет вид
char *strchr( char *s, int с);
Функция strchr просматривает строку s, осуществляя поиск указанного символа с. Функция strchr находит первое вхождение символа с в строке s и возвращает указатель на место найденного символа в строке.
Программа 3.5:
#include<string.h>
#include<stdio.h>
int main(void)
{char string[15];
char *ptr, с='г';
strcpy(siring, "This is a string");
pir strchr(slring, c);
if(ptr)
printf("Символ %с находится в позиции: %d\n", с, ptr-string);
else
printf("Указанный символ не найден\n");
return 0; }
Существует еще ряд функций для работы со строками, которые здесь не рассмотрены. Рассмотрим примеры работы с символами и строками.
Программа 3.6:
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<iostream.h>
void main() {
char st[25];
gets(st);
puts(st);
for(int i=0; i<=strlen(st); i++) {
if(isalpha(st[i])) cout<<”bukva "<<st[i]<<"\n";
if(isdigit(st[i])) cout<<"number "<<st[i]<<"\n";
}
Программа 3.7:
#include<stdlib.h>
#include<string.h>
#include<dos.h>
#included<stdio.h>
void main() {
struct dostime_t t;
char s[80]; '
char now_timc[3][10];
printf("Input string: ");
gets(s);
printf(“This string \n %s \n has length equal %d characters \n", s, strlen(s));
_dos_gettimc(&t);
gcvt((double)t.hour, 4, now_time[0]);
gcvt((double)t.minute, 4, now_time[1]);
gcvt((double)t.second, 4, now_time[2]);
printf("%s",now_time[0]);
printf(": %s",now_time[1]|);
printf(": %s",now_time[2]);
}
В этой пpoграмме используются:
переменная t типа struct dostime_t. Это структурированная переменная с полями hour, minute и second;
функция _dos_gettime(&t), которая и “добывает” системное время;
функция gcvt, преобразующая соответственно часы, минуты, секунды в привычную для нашего восприятия форму.
Следующие примеры иллюстрируют работу функций toupper и tolower из заголовочного файла ctype.h.
Программа 3.8:
#include<stdio.h>
#include<ctype.h>
main()
{ char str[]="String From Leiteis in Different Registers";
/* Cтрока Состоящая из Букв в Разных Регистрах; */
int i=1;
printf("Строка Будет Напечатана Заглавными Буквами");
while (str[i])
printf("%c", toupper(str [i++]));
return 1; }
Программа 3.9:
#include<stdio.h>
#include<ctype.h>
main()
{char str[]="String From Letters in Different Registers";
/*Cтpoкa Состоящая из Букв в Разных Регистрах":*/
printf(("Строка будет напечатана строчными буквами");
while(str[i]) printf("%c", tolower(str [ i++]));
return 1; }
