VisualC ++ 6.0 с unsigned long long и sprintf - PullRequest
4 голосов
/ 14 октября 2008

Я хочу, чтобы 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 выдает дескриптор исключения

есть предложения?

Ответы [ 3 ]

9 голосов
/ 14 октября 2008

Чтобы напечатать значение unsigned __int64 в Visual C ++ 6.0, вы должны использовать %I64u, а не %lli (см. эта страница в MSDN). %lli поддерживается только в Visual Studio 2005 и более поздних версиях. Итак, ваш код должен быть:

sprintf(buf, "%I64u, %s, %s", l, t1, t2);
1 голос
/ 14 октября 2008

printf использует многоточие для передачи списка переменных аргументов. (Нуль), который вы видите, является второй частью вашего длинного длинного, который, как оказалось, все 0 бит. Установите значение 1 << 60 + 1 << 30, и вы получите сбой, так как часть 1 << 60 интерпретируется как символ *. </p>

Правильным решением было бы разбить число на три части по 10 цифр, "verylongvalue% 10000000000" "(verylongvalue / 10000000000)% 10000000000" "verylongvalue / 100000000000000000000".

0 голосов
/ 14 октября 2008

Видимо, вы не присвоили additionaltext необходимому char * (строка). Обратите внимание, что long int был обработан, запятая была скопирована, и только %s сгенерировал (null).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...