diff --git a/lang_c/3/3__vvod_dannyh_scanf/article.md b/lang_c/3/3__vvod_dannyh_scanf/article.md index 62b2333..b5378e3 100644 --- a/lang_c/3/3__vvod_dannyh_scanf/article.md +++ b/lang_c/3/3__vvod_dannyh_scanf/article.md @@ -198,10 +198,10 @@ scanf("%f", &real_number); ``` - для ввода `3.1415\n` сохранит в переменную `real_number` значение `3.1415`; -- для ввода `-2.7182\n` сохраниет в переменную `real_number` значение `-2.7182`; -- для ввода `.001\n` сохраниет в переменную `real_number` значение `0.001`; -- для ввода `000123.456\n` сохраниет в переменную `real_number` значение `123.456`; -- для ввода `+6.4321\n` сохраниет в переменную `real_number` значение `6.4321`; +- для ввода `-2.7182\n` сохранит в переменную `real_number` значение `-2.7182`; +- для ввода `.001\n` сохранит в переменную `real_number` значение `0.001`; +- для ввода `000123.456\n` сохранит в переменную `real_number` значение `123.456`; +- для ввода `+6.4321\n` сохранит в переменную `real_number` значение `6.4321`; Отдельно остановимся на работе спецификатора `%c`. Он используется для считывания одного **любого** символа (в том числе и любого пробельного символа) из потока ввода. @@ -228,7 +228,7 @@ int main(void) Для наглядности я добавил в вывод символы `|`. Результат работы программы для всех пяти случаев представлен на следующем рисунке: -![Рис.4 Запуск программы Листинг 5 на различных входных данных](./l5.png "Рис.4 Запуск программы Листинг 3 на различных входных данных") +![Рис.4 Запуск программы Листинг 5 на различных входных данных](./l5.png "Рис.4 Запуск программы Листинг 5 на различных входных данных") % **Важно!** При считывании данных по формату `%c` пробельные символы не игнорируются. @@ -366,13 +366,13 @@ int main(void) scanf("%d %d", &a, &b, &c); // количество спецификаторов // не совпадает с количеством переменных - printf("%d\n", a + b c); + printf("%d\n", a + b + c); return 0; } ``` -Результат работа программы Листинг 8. +Результат работы программы Листинг 8. ![Рис.7 Ошибка! Несоответствие количества спецификаторов количеству переменных](./l8.png "Рис.7 Ошибка! Несоответствие количества спецификаторов количеству переменных") @@ -415,7 +415,7 @@ int main(void) ![](./l9.png) -В первом случае в переменной `value_read` будет записано значение `2`, т.к. функцию `scanf` успешно считает оба значения и запишет их в соответствующие переменные. Во втором случае в переменной `value_read` будет хранится значение `1`, т.к. из-за несоответствия входных данных формат-строке функция `scanf` не сможет прочитать второе значение и в результате своей работы присвоит значение лишь одной переменной `a`. +В первом случае в переменной `value_read` будет записано значение `2`, т.к. функция `scanf` успешно считает оба значения и запишет их в соответствующие переменные. Во втором случае в переменной `value_read` будет хранится значение `1`, т.к. из-за несоответствия входных данных формат-строке функция `scanf` не сможет прочитать второе значение и в результате своей работы присвоит значение лишь одной переменной `a`. Далее в курсе (в шестом уроке), вы изучите особые конструкции языка Си, которые позволят вам в зависимости от того, сколько данных было считано, изменять поведение программы, например, выводить ошибку, если не получилось сохраннить введённые данные. diff --git a/lang_c/3/3__vvod_dannyh_scanf/reference.md b/lang_c/3/3__vvod_dannyh_scanf/reference.md index a8a5eac..c052649 100644 --- a/lang_c/3/3__vvod_dannyh_scanf/reference.md +++ b/lang_c/3/3__vvod_dannyh_scanf/reference.md @@ -49,7 +49,7 @@ int main(void) Но функция `scanf` -- это особый случай. Эта функция должна **записать** новое значение в вашу переменную. Копия тут не прокатит -- нужен доступ к оригиналу. Поэтому мы используем `&`. В этом случае функция получает не какую-то там жалкую копию, а информацию о том, где в памяти находится наша переменная, а потому может записать в неё введенное пользователем значение. -Логика в этом примерно следующая. Мы относимся к любым функциям как к потенциально опасным объектам, которые могут повредить данные. Поэтому по умолчанию функции получают только копии данных -- это защищает от случайных изменений. А чтобы позволить функции работать с оригинальными данными, мы должно совершить сознательное действие -- передать адрес переменной. +Логика в этом примерно следующая. Мы относимся к любым функциям как к потенциально опасным объектам, которые могут повредить данные. Поэтому по умолчанию функции получают только копии данных -- это защищает от случайных изменений. А чтобы позволить функции работать с оригинальными данными, мы должны совершить сознательное действие -- передать адрес переменной. Мы ещё подробнее обсудим этот механизм, когда будем изучать, как можно создавать собственные функции.