Как вывести в консоль c
При запуске программы на Си автоматически открываются пять потоков, основными из которых являются следующие:
Стандартный поток ввода stdin
Стандартный поток вывода stdout
Стандартный поток вывода сообщений об ошибках stderr
Стандартный поток ввода stdin по умолчанию соответствует клавиатуре, а потоки stdout и stderr — экрану монитора.
Для управления вводом-выводом с помощью этих потоков используются ряд функций:
getchar() : ввод с клавиатуры одного символа
putchar() : вывод на консоль одного символа
gets() / fgets() : ввод одной строки
puts() : вывод одной строки на консоль
scanf() : ввод с форматированием данных
printf() : вывод с форматированием данных
Функции printf и scanf уже рассматиривались ранее, поэтому посмотрим, как применять остальные функции.
Ввод и вывод символов
Для ввода одного символа с клавиатуры применяется функция getchar() , которая имеет следующий прототип:
В качестве результата функция возвращает числовой код введенного символа.
Для вывода отдельного символа на консоль предназначена функция putchar() со следующим прототипом:
Выводимый символ в виде числового кода передается в putchar в качестве параметра, он же возвращается функцией.
Следует сказать, что на самом деле функции getchar() и putchar() полноценными функциями не являются, а определены как макросы в заголовочном файле stdio.h :
При использовании функции getchar следует учитывать, что при печати текста посредством клавиатуры в буфер операционной системы заносятся коды печатаемых символов, а сами символы отображаются на экране. Поучение программой введенного символа из буфера производится с помощью нажатия клавиши Enter.
И если буфер операционной системы не пуст, то при вызове функции getc() она получает очередной символ из буфера. Если же буфер пуст, то происходит чтение байта из потока ввода с помощью системной функции, название которой зависит от операционной системы.
При этом при нажатии клавиши Enter, в буфер также помещается код этой клавиши. То есть если мы введем один символ и нажмем на Enter, в буфере окажутся два числовых кода — введенного символа и клавиши Enter. И это надо учитывать при работе с функцией getchar. В частости, рассмотрим простой, но показательный пример:
Сначала на экран выводится цифра 1, после чего функция getchar ожидает ввода символа. Если после ввода символа мы нажмем Enter, то в буфер будет помещены два числовых кода — введеного символа и клавиши Enter. Поэтому при втором вызове getchar эта функция считывает байт из буфера — то есть числовой код клавиши Enter.
Например, введем при первом вызове функции getchar символ «a», а затем Enter:
Но если при каждом вызове getchar мы будем только нажимать клавишу Enter, тогда в буфер будет заноситься только код этой клавиши, и соответственно программа будет работать, как и ожидалось:
Применим функции getchar и putchar для ввода и вывода символов с клавиатуры:
Функция getchar считывает числовой код символа, который потом выводится в функции putchar. Для вывода из программы необходимо ввести комбинацию клавиш Ctrl+C.
Ввод и вывод строк
Вывод строк и puts
Для вывода одной строки на консоль предназначена функция puts() со следующим прототипом:
В качестве параметра передается указатель на строку, а возвращаемым результатом функции является последний выведенный символ.
При этом функция puts() будет выводить символы переданной строки, пока не дойдет до нулевого символа ‘\0’. Если же выводимый массив символов не содержит этого символа, то результат программы неопределен. Например:
Ввод строк и fgets
Для ввода строки с клавиатуры применяется функция fgets() , которая имеет следующий прототип:
В качестве первого параметра передается указатель на строку. Второй параметр указывает, сколько символов необходимо считать из потока в строку. Третий параметр указывает на поток ввода.
Например, считаем строку с консоли и затем выведем ее на консоль:
Здесь функция fgets считывает не более 15 символов в строку name. Если будет введено больше символов, то fgets все равно считает не более 15 символов. Таким образом функция позволяет проверить количество считываемых символов и поэтому считается безопасной.
Пример работы программы:
Ввод строк и gets
Для ввода строки с клавиатуры также может применяться функция gets() , которая имеет следующий прототип:
Вводимые данные помещаются в массив, на который указывает указатель *s, передаваемый в функцию в качестве параметра. При успешном прочтении строки функция возвращает адрес этого массива s. А в случае ошибки возвращается значение NULL .
При вводе символов функция gets() завершает свою работу при вводе символа ‘\n’, то есть при нажатии на клавишу Enter. Но вместо этого символа в строку записывается нулевой символ ‘\0’, который и будет указывать на завершение строки. Однако поскольку эта функция не проверяет количество введенных символов, то она считается не безопасной. Поэтому при компиляции программы с этой функцией ряд компиляторов могут выдавать предупреждение.
Используем функции для ввода строки:
Данная программа работает также, как и в предыдущем примере с функцией fgets.
Консольный ввод-вывод информации с примерами на C# и Windows Terminal
Консоль (Console)- характерная особенность ранних операционных систем (например, MS DOS), использующих интерфейс командной строки для интерактивного обмена информацией с пользователем. Консольные приложения используются и сейчас. По сравнению с графическим интерфейсом, интерфейс командной строки требует меньше системных ресурсов и предоставляет инструменты автоматизации для повторяющихся задач.
Наиболее яркими примерами интерфейсов командной строки (англ. Command line interface, CLI) являются: Командная оболочка Windows, PowerShell, а также Bash, доступная на всех платформах (наибольшее распространение Bash получил в Unix-системах и Mac, присутствует также в компонентах Подсистема Windows для Linux (англ. Windows Subsystem for Linux, WSL)).
В операционной системе Windows консоль называется окном командной строки, для вызова которой Вы можете пройти в меню Пуск — Командная строка. В 2019 году компания Micrsoft также представила Windows Terminal — современное консольное приложение для пользователей инструментов и оболочек командной строки, таких как Command Prompt, PowerShell и WSL.
Форма интерфейсов командной строки используется в основном для обработки сценариев команд с использованием последовательности операций чтения (для принятия данных путем ввода текстовой информации пользователем) и операций записи (в вывод консоли, для отображения результатов обратной связи).
На платформе Microsoft .Net Core такие операции в виде методов описаны в классе System.Console, предоставляющем базовую поддержку для приложений, считывающих и записывающих символы в консоль стандартных входных и выходных потоков.
Программный способ записи в вывод консоли
Для вывода информации на консоль применяются 2 ключевых метода класса Console — Console.WriteLine и Console.Write, отличие которых заключается в том, что WriteLine самостоятельно добавляет терминатор строки (разделитель строки) ко всему, что вы записали. Использование метода Write предполагает ручное разбиение строки на несколько путем добавления в запись вывода терминатора строки, где это необходимо.
Записывает указанные данные с текущим признаком конца строки в стандартный выходной поток.
Console.WriteLine(“Hello, World!”);
Console.WriteLine(“=Second Line=”);
Результатом вывода будет две строки.
Записывает текстовое представление заданного значения или значений в стандартный выходной поток без признака конца строки.
Console.Write(“Hello,”);
Console.Write(“ “);
Console.Write(“World!”);
Console.Write(Environment.NewLine);
Console.Write(“=Second Line=”);
Результат вывода этого примера идентичен.
Во втором примере для разделения строки используется в качестве терминатора свойство Environment.NewLine — это обеспечивает эффективный способ выбора комбинации символов конца строки, которая зависит от используемой вами платформы. Так, большинство Unix-систем применяет специальную комбинацию “\n” в качестве терминатора строки, тогда как Windows-системы “\r\n”.
Формирование строк
При выводе информации вы можете использовать операторы + или += , интерполяцию строк и иные методы для объединения и формирования строковых переменных.
Программный способ ввода информации с консоли
Как и запись в вывод, класс Console предоставляет различные методы для чтения ввода от пользователя.
Метод Console.ReadLine
Считывает набор символов до тех пор, пока не найдет признак окончания или новой строки, и возвращает все, что он считает, как строковое значение.
Console.WriteLine(“What is your name?”);
string response = Console.ReadLine();
Console.WriteLine(“Hello, “ + response+“!“);
Метод Console.Read
Считывает следующий символ в строке и возвращает его как код целочисленного символа.
Console.WriteLine(“Please, type anything: “);
int value = Console.Read();
Console.Write(“You typed: “ + (char)value);
В отличие от ReadLine , метод Read возвращает по одному символу за раз, пока не достигнет конца ввода. Read фактически не возвращает строку, он возвращает целое число, представление ASCII введенного символа. В примере используется функция char() для преобразования полученного целого числа, чтобы получить действительно введенный символ.
Метод Console.ReadKey
Считывает следующий символ в строке и возвращает его как экземпляр ConsoleKeyInfo.
ConsoleKeyInfo описывает нажатую клавишу, включая символ, представленный этой клавишей, и состояние управляющих клавиш-модификаторов (например, Shift, Alt и др.). Нижеследующий пример ожидает нажатия клавиши Enter.
Возможно ли в С вывести что-нибудь в консоль, не используя stdio.h?
Возможно ли в С вывести что-нибудь в консоль, не используя stdio.h, printf?
stdio.h — это буферизированная надстройка над базовыми функциями ввода-вывода read , write , объявленными в unistd.h.
Первый аргумент — файловый дескриптор — номер в таблице открытых файлов исполняемой программы. При запуске по стандарту заранее открыты три дескриптора: 0 — стандартный ввод, 1 — стандартный вывод, 2 — стандартный вывод ошибок. В некоторых системах могут быть ещё другие.
fwrite из того же stdio.h. Работает похожим образом, но через тот же буфер, как и printf :
Хотя она и вызывает write , но за счёт буферизации часто оказывается быстрее при записи большого количества данных в файл (при перенаправлении вывода). Безусловно fwrite быстрее printf , так как последняя ищет в строке форматные последовательности, начинающиеся со знака % .
fputs и puts из stdio.h выводят строку, оканчивающуюся нулевым байтом ( ‘\0’ ). Вторая добавляет ещё и символ конца строки и выводит только на стандартный вывод.
По скорости должны быть как fwrite , но отличаются способом определения длины строки, поэтому с их помощью невозможно вывести сами нулевые байты. Мои измерения в ubuntu однако показывают, что puts почему-то намного медленнее fputs и почти как printf .
![]()
Библиотечные функции, объявленные в conio.h, весьма различались в зависимости от компилятора. Первоначально реализованные в Microsoft Visual C++ различные функции привязывались напрямую к нескольким первым функциям DOS, связанным с прерыванием 21h. Но библиотека, поставляемая с Turbo C++ и Borland C++, не использует DOS API, а вместо этого напрямую обращается к видеопамяти для вывода информации и использования сигналов прерывания BIOS.
Также (зависит от железа, ОСи) можно выводить символы на экран с помощью прямой манипуляции памяти, которая отображена на видео буфер. Из книги «Computer Graphics Primer», написанной Mitchell Waite и опубликованной в 1979:

IBM VGA BIOS (mode 13h) режим предоставляет похожий доступ к видеопамяти как к 320×200 массиву пикселов с 256 цветами.
Обычно между программой и видеопамятью присутствует множество уровней абстракции. На Linux, если X не запущен(или в Ctrl + Alt + Fx виртуальной консоли), можно mmap /dev/fb0 устройство (Linux framebuffer всего на ступеньку выше работы с видеокартой напрямую—интерфейс предоставляется самим ядром):
Здесь buffer —это массив байтов размером screensize , запись в который позволяет рисовать в консоли, например, в режиме 1600×1200 32bpp ( screensize = 1600*1200*32/CHAR_BIT ), чтобы закрасить выбранный пиксель ярко жёлтым (красный+зелёный):
Вот пример кода, как квадрат нарисовать в консоли, используя framebuffer: How to display something on screen through linux framebuffer?