المرئي C ++ 6.0 مع غير الموقعة طويلة طويلة وsprintf
سؤال
وأريد أن sprintf () قيمة طويلة طويلة غير موقعة في المرئي 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
(يرجى الرجوع إلى <لأ href = "http://msdn.microsoft.com/en-us/library/aa272936٪28VS.60٪29 .aspx اتصال "يختلط =" نوفولو noreferrer "> هذه الصفحة على MSDN). ويدعم %lli
فقط في Visual Studio 2005 والإصدارات الأحدث.
لذلك، يجب أن تكون التعليمات البرمجية:
sprintf(buf, "%I64u, %s, %s", l, t1, t2);
نصائح أخرى
وprintf يستخدم القطع لتمرير قائمة وسيطة متغير. و(خالية) تراه هو الجزء الثاني من لديك فترة طويلة طويلة، ويحدث أن يكون كل 0 بت. تعيين إلى 1 << 60 + 1 << 30 وستحصل على الحادث باعتباره << 60 جزء 1 وتفسيره على أنه حرف *.
والحل الصحيح ستكون لكسر الرقم في ثلاثة أجزاء من 10 أرقام، "verylongvalue٪ 10000000000" "(verylongvalue / 10000000000)٪ 10000000000" "verylongvalue / 100000000000000000000".
وعلى ما يبدو، لم تعيين additionaltext
إلى char *
الضرورة (سلسلة). لاحظ أن long int
تم معالجتها، ونسخ فاصلة وإلا %s
لدت (null)
.