#include <stdio.h> // printf
#include <string.h> // strlen
int main() {
// есть 2 способа создать статичную (т.е. которая не создается динамически
// с помощью malloc) строку:
char str[] = "Hello, world!";
char* str2 = "Hello, world!";
// в обоих случаях происходит одно и то же:
// 1) выделяется память под массив символов "Hello, world!";
// 2) в конец массива символов добавляется символ '\0' (null-terminator);
// 3) выделяется память под указатель на тип char
// 4) адрес созданного массива записывается в указатель
// 5) теперь по указателю (str, str2) можно обращаться к массиву символов.
// мы можем скормить указатель на строку функции printf. используем %s для
// вывода строки:
printf("%s - просто выводим строку\n", str); // выведет "Hello, world!"
// первый способ: проходим от 0 до (не включительно) числа, равного длине
// строки. используем %c для вывода символа:
// что с этим способом не так?. дело в том, что вызов strlen(str) помещен в
// шапку цикла, и каждую итерацию вызов будет повторяться вплоть до окончания
// цикла.
for (int i = 0; i < strlen(str); i++) {
printf("%c", str[i]);
}
printf(" - длина строки вычисляется много раз\n");
// способ получше. заранее вычисляем вычисляем длину строки, и сохраняем
// это число в str_length:
int str_length = strlen(str);
for (int i = 0; i < str_length; i++) {
printf("%c", str[i]);
}
printf(" - длина строки вычисляется один раз\n");
// способ без вычисления длины, хорошо подходит для очень длинных строк.
// как уже знаешь, все строки в языке си на самом деле являются массивами
// символов. каждый символ кодируется числом (кодом) таблицы ASCII (т.е. по
// сути char это просто числа). существует так же специальный нулевой символ
// (null-terminator или '\0'), код которого равен нулю. он всегда автоматом
// добавляется в конец массива символов, обозначая конец строки.
// так вот: вместо того, чтобы лишний раз проходить по строке, вычисляя её
// длину можно вообще обойтись без этого, а заканчивать цикл лишь тогда,
// когда он наткнется на нулевой символ.
// так как символ '\0' равен числу 0, а все, что меньше либо равно 0
// воспринимается как "ложь", можно сделать так, чтобы цикл продолжался до
// тех пор, пока str[i] != '\0'. можно написать просто str[i], смысл не
// меняется.
for (int i = 0; str[i] != '\0'; i++) {
printf("%c", str[i]);
}
printf(" - способ с проверкой null-terminator'a\n");
// то же самое, только с помощью if. не 0 это 1. если не 0 то break.
for (int i = 0; ; i++) {
if (str[i] == '\0') {
break;
}
printf("%c", str[i]);
}
printf(" - способ с проверкой null-terminator'a, через if\n");
return 0;
}