Какого размера long и int?
Если nID - это длинная печать с форматом 'int' и sizeof(int)
! = sizeof(long)
, то с этого момента вы получите несогласованный доступ к данным (в том смысле, что выравнивание неверно).
Какой компилятор вы используете? GCC должен диагностировать проблему без затруднений, если это проблема. Точно так же, если nID - это long long, у вас могут возникнуть проблемы.
Чтобы ответить на ваш вопрос - да, на верхнем пределе длины строки есть нижняя граница, которую sprintf()
должен уметь обрабатывать. Это номер 509 для систем C89 и 4095 для систем C99.
Если быть точным, C99 говорит (fprintf()
, раздел §7.19.6.1, пункт 15):
Количество символов, которое может быть получено при любом одном преобразовании, должно быть не менее
4095
Нет дополнительной квалификации по sprintf()
.
С исправленной версией исправленного примера, преобразованного в компилируемый код:
#include <stdio.h>
int main(void)
{
char test[255] = {0};
int test1 = 2;
double test2 = 35.00;
int test3 = 0;
sprintf(test, "%d|%f|%d", test1, test2, test3);
puts(test);
return(0);
}
Я получаю вывод, который ожидал:
2|35.000000|0
Чтобы получить вывод, который вы показываете, вы должны работать с очень странной настройкой.
Показанное вами поведение указывает на то, что используемая вами функция sprintf()
сбита с толку относительно выравнивания или размера чего-либо. У вас есть прототип по объему, то есть вы #include <stdio.h>
? С GCC я получаю всевозможные предупреждения, когда опускаю заголовок:
x.c: In function ‘main’:
x.c:8: warning: implicit declaration of function ‘sprintf’
x.c:8: warning: incompatible implicit declaration of built-in function ‘sprintf’
x.c:9: warning: implicit declaration of function ‘puts’
Но даже с test2
, переопределенным как float
, я получаю правильный результат.
Если я изменю test2
на long double
, то получу другой набор предупреждений и другой результат:
x.c: In function ‘main’:
x.c:8: warning: implicit declaration of function ‘sprintf’
x.c:8: warning: incompatible implicit declaration of built-in function ‘sprintf’
x.c:8: warning: format ‘%f’ expects type ‘double’, but argument 4 has type ‘long double’
x.c:9: warning: implicit declaration of function ‘puts’
2|0.000000|0
Это ближе к тому, что вы видите, но далеко не идентично.
Поскольку у нас нет информации о платформе, я подозреваю, что вы работаете с действительно древней (или я имею в виду глючная?) Версией C. Но я все еще в некоторой растерянности, чтобы увидеть, как вы получаете то, что показываете - если только вы не находитесь на машине с прямым порядком байтов (я тестирую на Intel Mac с MacOS X 10.6.2) ... pause ... на машине SPARC под управлением Solaris 10, без #include <stdio.h>
и с long double test2 = 35.0;
, я получаю:
gcc -O x.c -o x && ./x
x.c: In function 'main':
x.c:8: warning: incompatible implicit declaration of built-in function 'sprintf'
2|-22446048024026502740613283801712842727785152907992454451420278635613183447049251888877319095301502091725503415850736723945766334416305449970423980980099172087880564051243997662107950451281495566975073444407658980167407319222477077473080454782593800009947058951029590025152409694784570786541673131117073399808.000000|0
Это другое; он также генерирует 321 символ вывода, поэтому там переполнение буфера - лучше использовать 'snprintf()
', чтобы этого не происходило. Конечно, когда все объявлено правильно, я получаю ожидаемый результат.
Итак, вы можете опубликовать скомпилированный код, который показывает вашу проблему, вместо фрагмента, который этого не делает? И можете ли вы определить свою платформу - тип компьютера, версию операционной системы, версию компилятора (и, возможно, версию библиотеки C)?