Во встроенных системах printf
может иногда перетаскивать всю поддержку чисел с плавающей запятой для строк формата, таких как %f
.
Более интеллектуальные среды сделают опции с плавающей запятой для printf
опциональной вещью.
Но даже для целых чисел в printf
есть много кода общего назначения, и вы можете обнаружить, что он более компактен для написания ваших собственных подпрограмм, адаптированных к вашим специфическим потребностям, таким как:
outInt (char *buff, int intVal);
outChr (char *buff, char chVal);
outStr (char *buff, char *strVal);
и т. Д. Для записи в буферы, затем outBuff (char *buff)
для отправки в файл или на стандартный вывод.
Например, если вы контролируете используемые данные (без переполнения строк, 16-битных чисел, дополняющих целые числа и т. Д.), Вы можете использовать следующие функции:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void outChr (char *buff, char chVal) {
*buff++ = chVal;
*buff = '\0';
}
void outStr (char *buff, char *strVal) {
strcpy (buff, strVal);
}
void outInt (char *buff, int intVal) {
int divisor = 10000, printing = 0;
// Special cases.
if (intVal == -32768) { outStr (buff, "-32768"); return; }
if (intVal == 0) { outChr (buff, '0'); return; }
// Handle negatives.
if (intVal < 0) { outChr (buff++, '-'); intVal = -intVal; }
// Handle non-zero positives <= 32767.
while (divisor > 0) {
if ((intVal >= divisor) || printing) {
outChr (buff++, "0123456789"[intVal/divisor]);
printing = 1;
}
intVal = intVal % divisor;
divisor /= 10;
}
}
int main (int argc, char *argv[]) {
char buff[1000];
int i;
for (i = 1; i < argc; i++) {
outInt (buff, atoi (argv[i]));
printf ("[%s] -> [%s]\n", argv[i], buff);
}
return 0;
}
Запуск этого с:
pax$ tstprg 32767 10000 9999 10 9 1 0 -1 -9 -10 -99 -10000 -32767 -32768
выходы:
[32767] -> [32767]
[10000] -> [10000]
[9999] -> [9999]
[10] -> [10]
[9] -> [9]
[1] -> [1]
[0] -> [0]
[-1] -> [-1]
[-9] -> [-9]
[-10] -> [-10]
[-99] -> [-99]
[-10000] -> [-10000]
[-32767] -> [-32767]
[-32768] -> [-32768]
Эти функции должны быть относительно небольшими по размеру, поскольку они предназначены для конкретных нужд, а не для более общего семейства printf
.