Язык Си в примерах/Чтение и печать целого числа без использования stdio

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры

Используя функции 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;
  
 }

Дятел