Проход по строке в цикле

Run Settings
LanguageC
Language Version
Run Command
#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; }
Editor Settings
Theme
Key bindings
Full width
Lines