Строки есть массивы БУКВ - типа 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); /* ОДИН аргумент - сам массив */
передается только сам массив, а его текущая длина может быть при нужде вычислена при помощи некоей функции, вроде такой: