sprintf for unsigned _int64

匿名 (未验证) 提交于 2019-12-03 02:12:02

问题:

I am having following code. output of second %d in sprintf is always shown as zero. I think i am specifying wrong specifiers. Can any one help me in getting write string with right values. And this has to achieved in posix standard. Thanks for inputs

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);     } 

Output:

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

回答1:

I don't know what POSIX has to say about this, but this is nicely handled by 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 ); } 

If your compiler isn't C99 compliant, get a different compiler. (Yes, I'm looking at you, Visual Studio.)

PS: If you are worried about portability, don't use %lld. That's for long long, but there are no guarantees that long long actually is the same as _int64 (POSIX) or int64_t (C99).

Edit: Mea culpa - I more or less brainlessly "search & replace"d the _int64 with int64_t without really looking at what I am doing. Thanks for the comments pointing out that it's uint64_t, not unsigned int64_t. Corrected.



回答2:

You need to use %I64u with Visual C++.

However, on most C/C++ compiler, 64 bit integer is long long. Therefore, adopt to using long long and use %llu.



回答3:

If you are looking for a portable solution, then use printf macros from <inttypes.h>. You may need to define __STDC_FORMAT_MACROS to make these available in C++.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!