Руководство полного чайника по программированию на языке Си

       

СТРОКИ


Строки есть массивы БУКВ - типа char, оканчивающиеся спецсимволом \0

char string[20];

string[0] = 'П'; string[1] = 'р'; string[2] = 'и'; string[3] = 'в'; string[4] = 'е'; string[5] = 'т'; string[6] = '\0';

printf("%s\n", string);

%s - формат для печати СТРОК. Никакие другие массивы не могут быть напечатаны целиком одним оператором.

char string[20];

string[0] = 'П'; string[1] = 'р'; string[2] = 'и'; string[3] = 'в'; string[4] = 'е'; string[5] = 'т'; string[6] = '\n'; /* Перевод строки - тоже буква */ string[7] = '\0';

printf("%s", string);

или даже просто

printf(string);

Такие массивы можно записать в виде строки букв в ""

char string[20] = "Привет\n";

Оставшиеся неиспользованными символы массива от string[8] до string[19] содержат МУСОР.



ПОЧЕМУ ДЛЯ СТРОК ИЗОБРЕЛИ СИМВОЛ "ПРИЗНАК КОНЦА"? ================================================= Строка - это ЧАСТЬ массива букв. В разное время число букв в строке может быть различным, лишь бы не превышало размер массива (тогда случится сбой программы). Значит, следует где-то хранить текущую длину строки (число использованных символов). Есть три решения: (1) В отдельной переменной. Ее следует передавать во все функции обработки данной строки (причем она может изменяться).

char str[32]; /* массив для строки */ int slen; /* брать первые slen букв в этом массиве */ ... func(str, &slen); /* ДВА аргумента для передачи ОДНОЙ строки */ ...

Этот подход работоспособен, но строка разбивается на два объекта: сам массив и переменную для его длины. Неудобно.

(2) Хранить текущую длину в элементе str[0], а буквы - в str[1] ... итд. Плохо тем, что в str[0] можно хранить лишь числа от 0 до 255, и если строка длиннее - то такой подход неприменим.

(3) Не хранить длину НИГДЕ, а ввести символ-признак конца строки. Теперь в

func(str); /* ОДИН аргумент - сам массив */

передается только сам массив, а его текущая длина может быть при нужде вычислена при помощи некоей функции, вроде такой:


int strlen(char s[]){ /* функция от массива букв */ int counter = 0; /* счетчик и одновременно индекс */

while(s[counter] != '\0') /* пока не встретился признак конца текста */ counter++; /* посчитать символ */ return counter; /* сколько символов, отличных от '\0' */ }

Тут никаких ограничений нет. Именно этот подход и был избран в языке Си, хотя в принципе можно самому пользоваться и другими. На самом деле в языке есть такая СТАНДАРТНАЯ функция strlen(s) (вам не надо писать ее самому, ее уже написали за вас).

ИНИЦИАЛИЗАЦИЯ ГЛОБАЛЬНОГО МАССИВА ================================= Массив, заданный вне каких-либо функций, можно проинициализировать константными начальными значениями:

int array[5] = { 12, 23, 34, 45, 56 };

char string[7] = { 'П', 'р', 'и', 'в', 'е', 'т', '\0' };

Если размер массива указан БОЛЬШЕ, чем мы перечислим элементов, то остальные элементы заполнятся нулями (для int) или '\0' для char.

int array[5] = { 12, 23, 34 };

Если мы перечислим больше элементов, чем позволяет размер массива - это будет ошибкой.

int a[5] = { 177, 255, 133 };

Операция индексации массива a[] дает:

при n значение выражения a[n] есть

-1 не определено (ошибка: "индекс за границей массива") 0 177 1 255 2 133 3 0 4 0 5 не определено (ошибка)


Содержание раздела