المرئي C ++ 6.0 مع غير الموقعة طويلة طويلة وsprintf

StackOverflow https://stackoverflow.com/questions/200676

  •  03-07-2019
  •  | 
  •  

سؤال

وأريد أن 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).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top