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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
в функции scan_int возврощаемый результат необходимо умножить на переменную sign. иначе возврощаемое число всегда буддет положительным.
м Категоризация по запросу на w:ВП:РДБ
Строка 81: Строка 81:
}
}
</source>
</source>
[[Категория:Язык Си в примерах|Чтение и печать целого числа без использования stdio]]

Версия от 10:25, 27 сентября 2009

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


  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 <sys/syscall.h>
 #define N 100
  
 char buffer[N];
  
 void print_int (int);
 int  scan_int  (void);
  
  
 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;
  
 }