CC++ / СС++ - сборник литературы / Книга по Си / Bookc / book011
.htmДокументация по Cи, C++ и Visual C++ Массивы символов
Стр. 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);
}< Назад > < Дальше >