Visual C ++ 6.0 con unsigned long long e sprintf
Domanda
Voglio sprintf () un valore long long senza segno in Visual C ++ 6.0 (semplice 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);
fornisce il risultato
12345678, (null), test1
(osserva che test2
non è stampato)
e l = 123456789012345
fornisce un handle di eccezione
qualche suggerimento?
Soluzione
Per stampare un unsigned __int64
valore in Visual C ++ 6.0 è necessario utilizzare %I64u
, non %lli
(fare riferimento a questa pagina su MSDN). <=> è supportato solo in Visual Studio 2005 e versioni successive.
Quindi, il tuo codice dovrebbe essere:
sprintf(buf, "%I64u, %s, %s", l, t1, t2);
Altri suggerimenti
printf usa i puntini di sospensione per passare un elenco di argomenti variabili. Il (null) che vedi è la seconda parte del tuo long long, che risulta essere tutti 0 bit. Impostalo su 1 & Lt; & Lt; 60 + 1 & Lt; & Lt; 30 e otterrai un crash come 1 & Lt; & Lt; 60 parte viene interpretato come un carattere *.
La soluzione corretta sarebbe quella di scomporre il numero in tre parti di 10 cifre, " valore molto lungo% 10000000000 " " (valore molto lungo / 10000000000)% 10000000000 " & Quot; verylongvalue / 100.000.000.000 miliardi quot &;.
Apparentemente, non hai assegnato additionaltext
al char *
(stringa) necessario. Si noti che long int
è stato elaborato, la virgola è stata copiata e solo il %s
generato (null)
.