web-dev-qa-db-fra.com

sprintf pour non signé _int64

J'ai le code suivant. La sortie du deuxième% D dans Sprintf est toujours indiquée à zéro. Je pense que je spécifie des spécificateurs incorrects. Quelqu'un peut-il m'aider à obtenir une chaîne d'écriture avec de bonnes valeurs? Et cela doit être atteint dans la norme POSIX. Merci pour les intrants

void main() {
    unsigned _int64 dbFileSize = 99;
    unsigned _int64 fileSize = 100;
    char buf[128];
    memset(buf, 0x00, 128);
    sprintf(buf, "\nOD DB File Size = %d bytes \t XML file size = %d bytes", fileSize, dbFileSize);
    printf("The string is %s ", buf);
    }

Sortir:

The string is
OD DB File Size = 100 bytes      XML file size = 0 bytes 
19
venkysmarty

Je ne sais pas ce que Posix a à dire à ce sujet, mais c'est bien géré par Core C99:

#include <stdio.h>
#include <inttypes.h>

int main(void) {
    uint64_t dbFileSize = 99;
    uint64_t fileSize = 100;
    char buf[128];
    memset(buf, 0x00, 128);
    sprintf( buf, "\nOD DB File Size = %" PRIu64 " bytes \t"
                  " XML file size = %" PRIu64 " bytes\n"
                  , fileSize, dbFileSize );
    printf( "The string is %s\n", buf );
}

Si votre compilateur n'est pas conforme au C99, obtenez un autre compilateur. (Oui, je te regarde, Visual Studio.)

PS : Si vous êtes inquiet de la portabilité, ne Utilisez %lld. C'est pour long long, mais il n'y a pas de garantie que long long réellement la même chose que _int64 (POSIX) ou int64_t (C99).

EDIT : MEA CULPA - I plus ou moins cerveau "Rechercher et remplacer" D the _int64 avec int64_t Sans vraiment regarder ce que je fais. Merci pour les commentaires indiquant que c'est uint64_t, ne pas unsigned int64_t. Corrigée.

14
DevSolar

Vous devez utiliser % I64 avec Visual C++.

Cependant, sur la plupart des compilateurs C/C++, l'entier 64 bits est long depuis longtemps. Par conséquent, adoptez l'utilisation long Long et utilisation % LL.

14
Shamim Hafiz

Si vous recherchez une solution portable, utilisez ensuite Macros Printf de <inttypes.h>. Vous devrez peut-être définir __STDC_FORMAT_MACROS Pour les rendre disponibles en C++.

11
Maxim Egorushkin