Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions lang_c/3/3__vvod_dannyh_scanf/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`. Он используется для считывания одного **любого** символа (в том числе и любого пробельного символа) из потока ввода.
Expand All @@ -228,7 +228,7 @@ int main(void)

Для наглядности я добавил в вывод символы `|`. Результат работы программы для всех пяти случаев представлен на следующем рисунке:

![Рис.4 Запуск программы Листинг 5 на различных входных данных](./l5.png "Рис.4 Запуск программы Листинг 3 на различных входных данных")
![Рис.4 Запуск программы Листинг 5 на различных входных данных](./l5.png "Рис.4 Запуск программы Листинг 5 на различных входных данных")

% **Важно!**
При считывании данных по формату `%c` пробельные символы не игнорируются.
Expand Down Expand Up @@ -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 Ошибка! Несоответствие количества спецификаторов количеству переменных")


Expand Down Expand Up @@ -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`.

Далее в курсе (в шестом уроке), вы изучите особые конструкции языка Си, которые позволят вам в зависимости от того, сколько данных было считано, изменять поведение программы, например, выводить ошибку, если не получилось сохраннить введённые данные.

Expand Down
2 changes: 1 addition & 1 deletion lang_c/3/3__vvod_dannyh_scanf/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ int main(void)

Но функция `scanf` -- это особый случай. Эта функция должна **записать** новое значение в вашу переменную. Копия тут не прокатит -- нужен доступ к оригиналу. Поэтому мы используем `&`. В этом случае функция получает не какую-то там жалкую копию, а информацию о том, где в памяти находится наша переменная, а потому может записать в неё введенное пользователем значение.

Логика в этом примерно следующая. Мы относимся к любым функциям как к потенциально опасным объектам, которые могут повредить данные. Поэтому по умолчанию функции получают только копии данных -- это защищает от случайных изменений. А чтобы позволить функции работать с оригинальными данными, мы должно совершить сознательное действие -- передать адрес переменной.
Логика в этом примерно следующая. Мы относимся к любым функциям как к потенциально опасным объектам, которые могут повредить данные. Поэтому по умолчанию функции получают только копии данных -- это защищает от случайных изменений. А чтобы позволить функции работать с оригинальными данными, мы должны совершить сознательное действие -- передать адрес переменной.

Мы ещё подробнее обсудим этот механизм, когда будем изучать, как можно создавать собственные функции.

Expand Down
Loading