Язык Си в примерах/Чтение и печать целого числа без использования stdio: различия между версиями
в функции scan_int возврощаемый результат необходимо умножить на переменную sign. иначе возврощаемое число всегда буддет положительным. |
Ashikbot (обсуждение | вклад) м Категоризация по запросу на w:ВП:РДБ |
||
Строка 81: | Строка 81: | ||
} |
} |
||
</source> |
</source> |
||
[[Категория:Язык Си в примерах|Чтение и печать целого числа без использования stdio]] |
Версия от 10:25, 27 сентября 2009
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
Используя функции 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;
}