#35. Строки. Способы объявления, escape-последовательности | Язык C для начинающих

preview_player
Показать описание


Узнаете о способах объявления строк в программах на языке Си. Что такое символ конца строки и для чего он нужен. Управляющие (escape) последовательности для строк.
Рекомендации по теме
Комментарии
Автор

Вас можно слушать бесконечно. Полезный урок. Спасибо большое !

vladimirastrelin
Автор

Сергей большое спасибо за Ваши уроки ! Смотрю с большим интересом.

nrwdfyn
Автор

Спасибо Вам! Давольно не обычно строки в С)

donfedor
Автор

Несколько дополнений:
1) В уроке не сказано, что escape-последовательности можно использовать для задания символов, а не только строк. Например,
char c='\'';
задает символ апостроф, который нельзя задать непосредственно (char c=''''; вызовет ошибку).
2) Начинающие пытаются ввести "пустой символ" как '' (два апострофа). Например, чтобы показать, что "символов у нас пока нету". Это неверно, символ всегда ровно 1, ни больше, ни меньше. Но есть так называемые multichar литералы: когда можно в апострофах написать несколько символов, а компилятор побайтно их упакует в одно целое число. Например, 'Test' равно числу 0x54657374. Но это не то же самое, что строка "Test" ! Кстати, multichar - возможность, зависящая от реализации (implementation-defined), поэтому разные компиляторы могут упаковывать по-разному. Так что для переносимости, лучше сразу писать число 0x54657374, а не цепочку символов в апострофах.
3) Сравним: printf("c=\\"); и printf("c=%%"); Выведено будет \ и %. Вроде бы понятно - "два символа \ кодируют один символ \, а два символа % кодируют один %". Но ситуация разная:
для "c=\\" компилятор создает строку из 4-х символов (c, =, \, \0) и передает ее функции printf, которая все эти символы (кроме завершающего нулевого) выводит "как есть"; .
для "c=%%" компилятор создает строку из 5-ти символов (c, =, %, %, \0) и передает ее функции printf, которая выводит символы с=, потом видит специальный символ формата %, начинает обрабатывать его особым образом - читает следующий символ % и выводит его, затем видит нулевой символ и завершает работу.
4) Ясно, зачем кодировать табуляцию, кавычки и апостроф. Но зачем специальное кодирование для знака вопроса \?, разве это не самый обыкновенный знак? Оказывается, когда-то давно были "триграфы" (trigraphs), для кодирования символов, которых не было на клавиатуре (например, вместо символов [ ] {} | были всякие немецкие умляуты). Поэтому для кодирования подобных символов нужно было писать вроде "??(" - компилятор (вернее препроцессор) заменял это на "[". Вот чтобы ?? воспринималось как два вопроса, а не начало триграфа и требовалось писать перед одним из них бэкслэш: "?\?(". Сейчас, в большинстве компиляторов триграфов нет, но этот режим можно включить специальной опцией.
5) Забегая в следующую тему. В таблице escape-последовательностей есть \n-перевод на новую строку (\0x0A) и \r-возврат каретки (0x0D). Компилятор заменяет это сочетание в строковом или символьном литерале на один символ. Но функции, подобные printf и scanf, могут при вводе-выводе заменять один такой символ на другой или на пару, в зависимости от текущей платформы. Например, в Windows-программе printf("Hi!\n"); компилятор передаст функции printf 5 символов (считая и завершающий \0), а в консоль будет выведены символы H, i, !, \r, \n. Аналогично, функция scanf при вводе заменит пару символов \r, \n на один - \n. Но такую замену делают функции ввода-вывода, а не компилятор, формирующий строковые или символьные литералы.

olegkomlev
Автор

В самом начале немного напугали, тем что каждый символ придется записывать в отдельные ' ' . Прям получилось как в сценариях боевиков. С самого начала все плохо, но как всегда в конце все становится

andrey_sautenko
Автор

Подправьте если я не прав )
Пишу для тех кто не понял чтото(хотя материал преподнесен богоподобно).
1)Когда вы прописываете char *str="hello", то это слово сохраняется в таблице строк, т.е не подлежит изменениям, и на самом деле указателю присваивается не строка, а указатель на строку, который генерируется автоматически при прописывании строки.А указатели, как вы знаете, работают по приницпу "непрямого доступа", т.е косвенно можете менять содержимое, используя *, &.Но а как вы можете его изменить, если он находится в неизменяемой области памяти -> никак )))
2)Массив: когда вы создали массив, в него пересылается КОПИЯ вашей строки => можете ее менять

kyami
Автор

А если я хочу русские символы вводить, а их нет?

kvmxknh
Автор

Надо больше комментариев для продвижения видео

renigat_tv