Язык Си в примерах/Чтение и печать целого числа без использования stdio
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
- XCC C
Используя функции scanf и printf можно считывать форматированный ввод и печатать форматированный вывод. Их возможности очень велики.
scanf
и printf
не есть команды языка C. Они являются функциями, определенными в стандартной библиотеке ANSI C.
Возникает вопрос: Как они описаны в этой библиотеке?
Ответ: Есть более низкоуровневые функции для считывания и печати данных, но они платформозависимые (зависят от архитектуры компьютера и операционной системы).
В OS Linux присутствуют системные вызовы read
и write
, которые читают (пишут) указанное количество байт из (в) указанный поток.
Аргументы у этих системных вызовов одинаковые, их три штуки:
- идентификатор потока ввода/вывода (дескриптор потока)
- адрес, куда нужно помещать или откуда нужно брать байты
- максимальное количество байт, которое мы хотим считать (напечатать)
Стандартный поток ввода имеет идентификатор (дескриптор потока) равный 2. Стандартный поток вывода имеет идентификатор 1.
Возвращаемое значение равно количеству успешно записанных (считанных) байт.
#include <syscall.h>
#define N 100
char buffer[N];
void print_int (int);
int scan_int (void);
int main()
{
int a = scan_int();
int b = scan_int();
print_int(a+b);
return 0;
}
void print_int(int a)
{
char minus = '-';
if(a < 0) {
write(1, &minus, 1);
a = -a;
}
int i = N;
buffer[--i] = '\n';
while(a)
{
buffer[--i] = '0' + (a % 10);
a /= 10;
}
write(1, &(buffer[i]), N - i);
}
int scan_int()
{
int i = 0, res = 0, sign = 1;
int n = read(2, buffer, N);
if (buffer[i] == '-') {
sign = -1;
i++;
}
for(; i < n ; i++)
{
if( buffer[i] >= '0' && buffer[i] < '9' )
{
res *= 10;
res += buffer[i] - '0';
} else {
break;
}
}
return res*sign;
}