scanf () и printf () являются функциями в libc (стандартная библиотека C), и они вызывают системные вызовы read () и write () соответственно, обращаясь к файловым дескрипторам stdin и stdout соответственно (fscanf и fprintf) позволяет указать поток файлов, из которого вы хотите читать / записывать).
Вызовы read () и write () (и все системные вызовы) приводят к «переключению контекста» из приложения уровня пользователя в режим ядра, что означает, что оно может выполнять привилегированные операции, такие как непосредственный обмен данными с оборудованием. В зависимости от того, как вы запустили приложение, файловые дескрипторы 'stdin' и 'stdout', вероятно, связаны с консольным устройством (таким как tty0) или каким-либо виртуальным консольным устройством (например, предоставляемым xterm). read () и write () безопасно копируют данные в / из буфера ядра, называемого 'uio'.
Часть преобразования строк формата в scanf и printf не происходит в режиме ядра, но только в обычном пользовательском режиме (внутри 'libc'), общее правило с системными вызовами заключается в том, что вы переключаетесь в режим ядра как можно реже как во избежание снижения производительности при переключении контекста, так и в отношении безопасности (вам нужно быть очень осторожным со всем, что происходит в режиме ядра! меньше кода в режиме ядра означает меньше ошибок / дыр в безопасности операционной системы).
кстати ... все это было написано с точки зрения Unix, я не знаю, как работает MS Windows.