VisualC++ 6.0 с unsigned long long и sprintf
Вопрос
Я хочу sprintf() беззнаковое длинное значение в Visual C++ 6.0 (обычный C).
char buf[1000]; //bad coding
unsigned __int64 l = 12345678;
char t1[6] = "test1";
char t2[6] = "test2";
sprintf(buf, "%lli, %s, %s", l, t1, t2);
дает результат
12345678, (null), test1
(смотри это test2
не печатается)
и l = 123456789012345
это дает дескриптор исключения
какие-либо предложения?
Решение
Чтобы распечатать unsigned __int64
значение в Visual C++ 6.0, которое вы должны использовать %I64u
, нет %lli
(Ссылаться на эта страница в MSDN). %lli
поддерживается только в Visual Studio 2005 и более поздних версиях.Итак, ваш код должен быть:
sprintf(buf, "%I64u, %s, %s", l, t1, t2);
Другие советы
printf использует многоточие для передачи списка переменных аргументов.(Нулевой), который вы видите, — это вторая часть вашего длинного длинного значения, все из которого состоят из 0 бит.Установите значение 1<<60+1<<30, и вы получите сбой, поскольку часть 1<<60 интерпретируется как символ*.
Правильным решением было бы разбить число на три части по 10 цифр: "verylongvalue % 10000000000" "(verylongvalue/10000000000) % 10000000000" "verylongvalue/100000000000000000000".
Судя по всему, вы не назначили additionaltext
к необходимому char *
(нить).Обратите внимание, что long int
было обработано, запятая была скопирована и только %s
созданный (null)
.