Массивы символов

Стр. 11 < оглавление > Любая символьная константа, например "ОЙ У ПОЛИ КРИНИЧКА", представляет собой массив символов. Во внутреннем представлении компилятор завершает такой массив символом "\0", так что любая программа может по нему легко обнаружить конец строки. Поэтому строка занимает в паямяти на один символ больше, чем записано между двойными кавычками. Нумерация элементов массива начинается с нуля. Надо помнить, что, например 'T' - это символ(буква), а ' T ' - это строка, состоящая из двух символов: 'T' и '\0'. Отсюда следует, что пустых строк не бывает.
Строка в языке Си - это разновидность константы и ее можно присваивать некоторой переменной, представляющей массив символов:

char str[]="ТЕКСТ";

Такая запись и короче и понятнее, чем общепринятая для начальной инициализации массивов:

char str[]={'Т','Е','К','С','Т',};

Если длина строки в квадратных скобках опущена, то она определяется автоматически, по количеству присваеваемых символов. В приведенном выше примере она равна шести.
Запишем программу (пример 4.1), в которой функция main формирует строку по указанному выше правилу и вызывает функцию length, которая в качестве аргумента получает начальный адрес этой строки и вычисляет ее длину(без учета завеершающего символа). Эта функция представляет собой самостоятельный интерес и будет использована нами а дальнейшем как библиотечная.

Пример 4.1

/*длина сторки*/ length(s); char s[]; { int l=0;
while(s[l]!='\0')
i++;
return(i);
}
#include <stdio.h>
main()
{
static char str[]="ОЙ У ПОЛИ КРИНИЧКА";
printf("%d",length(str));
}

Программа приведенная ниже (пример 4.2), выполняет сцепление двух строк. Собственно, сцепление выполняет функция concat(s,t), которая присоединят строку t к концу строки s. Объединяемые строки str1 и str2 объявлены как внешние, причем размер str1 достаточно большой, чтобы сохранить новую строку. Используя спецификацию формата %s, функция printf выводит всю строку сразу, причем она "знает", что печать остановить при достижении завершающего символа "\0".

Пример 4.2

/*сцепление строк*/ concat(s,t) char s[],t[]; { int i,j;
i=j=0;
/*поиск конца строки*/
while(s[i]!='\0')i++;
while((s[i++]=t[j++])!='\0');
/*копия t*/
#include <stdio.h>
char str1[45]="ОЙ ТАМ У ПОЛИ КРИНИЧКА";
char str2[]="ТАМ ХОРОША ВОДИЧКА";
main()
{
concat(str1,str2);
printf("%s",str);
}

На пример 4.3 приведена программа с функцией revers(s), переставляющей символы строки s в обратном порядке. В качестве библиотечной исползуется ранее рассматривавшаяся функция length. Функция revers меняет местами символы строки, симетричные относительно ее середины; если в строке нечетное число символов, то средний символ остается на месте.

Пример 4.3

/*вращение строки*/ #include stdio.h #include "length.c" revers(s) char s[];
{
int l,i=0;
l=length(s);
while(i_=l/2)
{
c=s[i]; s[i]=s[l-i-1];
s[l-i-1]=c;
i++;
}
}
main()
{
static char str[]= "ОЙ У ПОЛИ КРИНИЧКА";
revers(str);
printf("%s\n",str);
}

< Назад > < Дальше >