سؤال

أحاول طباعة أنواع مثل off_t و size_t. وبعد ما هو العنصر النائب الصحيح ل printf() هذا هو المحمول?

أم أن هناك طريقة مختلفة تماما لطباعة هذه المتغيرات؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام z لحجم الحجم و t ل ptrdiff_t كما في

printf("%zu %td", size, ptrdiff);

لكن Manpage يقول إن بعض المكتبة الأكبر سنا استخدمت شخصية مختلفة عن z وتثبيط استخدامها. ومع ذلك، فإنها موحدة (من قبل معيار C99). لأولئك intmax_t و int8_t من stdint.h وهلم جرا، وهناك وحدات الماكرو التي يمكنك استخدامها، مثل إجابة أخرى قال:

printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);

يتم سردها في Manpage of inttypes.h.

شخصيا، أود فقط أن ألقي القيم unsigned long أو long مثل إجابة أخرى توصي. إذا كنت تستخدم C99، فيمكنك (وينبغي، بالطبع) unsigned long long أو long long واستخدام %llu أو %lld التنسيقات على التوالي.

نصائح أخرى

لطباعة off_t:

printf("%jd\n", (intmax_t)x);

لطباعة size_t:

printf("%zu\n", x);

لطباعة ssize_t:

printf("%zd\n", x);

انظر 7.19.6.1/7 في معيار C99، أو أكثر وثائق بوسيكس أكثر ملاءمة لرموز التنسيق:

http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html.

إذا كان تنفيذك لا يدعم رموز التنسيق هذه (على سبيل المثال لأنك على C89)، فسيكون لديك بعض المشكلة نظرا لأن AFAIK ليس هناك أنواع عدد صحيح في C89 التي تحتوي على رموز تنسيق ويضمن أن تكون كبيرة كما هذه الأنواع. لذلك تحتاج إلى القيام بشيء خاص بالتنفيذ.

على سبيل المثال إذا كان لديك مترجم الخاص بك long long ودعم مكتبة القياسية الخاصة بك %lld, ، يمكنك أن تتوقع بثقة أن تخدم بدلا من ذلك intmax_t. وبعد ولكن إذا لم يكن كذلك، فسيتعين عليك العودة إلى long, ، والتي ستفشل في بعض التطبيقات الأخرى لأنها صغيرة جدا.

بالنسبة ل Microsoft، فإن الجواب مختلف. يتوافق VS2013 إلى حد كبير C99 ولكن [T] هو HH، J، Z، وبطئيات طول T غير مدعومة." بالنسبة إلى size_t "هذا هو، غير موقعة __int32 على منصات 32 بت، غير موقعة __int64 على منصات 64 بت" استخدام البادئة I (عين رأس المال) مع محدد نوع O، U أو X أو X. انظر VS2013 حجم المواصفات

أما بالنسبة ل Outh_t، يتم تعريفها طالما في VC incover Sys Lys.h.

أي إصدار من ج هل تستخدمها؟

في C90، تتمثل الممارسة المعيارية في الإدلاء لفترة طويلة أو غير موقعة، حسب الاقتضاء، والطباعة وفقا لذلك. لقد رأيت٪ z for size_t، ولكن هاربيسون وستيل لا يذكره تحت printf ()، وفي أي حال لن يساعدك في ptrdiff_t أو أي شيء.

في C99، تأتي أنواع _T المختلفة مع وحدات ماكرو الطباعة الخاصة بهم، لذلك مثل شيء مثل "Size is " FOO " bytes." لا أعرف التفاصيل، ولكن هذا جزء من تنسيق رقمي كبير إلى حد ما

سترغب في استخدام وحدات ماكرو تنسيق من inttypes.h.

انظر هذا السؤال: عبر سلسلة تنسيق منصة للمتغيرات من النوع Size_t؟

انظر الى man 3 printf على Linux، OS X، و OpenBSD جميع إظهار الدعم ل %z بالنسبة size_t و %t بالنسبة ptrdiff_t (ل C99)، ولكن لا أحد من الناطفا off_t. وبعد اقتراحات في البرية عادة ما تقدم %u تحويل ل off_t, ، وهو "صحيح بما فيه الكفاية" بقدر ما أستطيع أن أقول (كلاهما unsigned int و off_t تختلف بشكل متطابق بين أنظمة 64 بت و 32 بت).

رأيت هذا المنشور مرتين على الأقل، لأن الإجابة المقبولة يصعب تذكرني (نادرا ما استخدم z أو j أعلام وهم لا يبدو منصة مستقلة).

ال اساسي لا تقول بوضوح طول البيانات بالضبط size_t, ، لذلك أقترح عليك أولا التحقق من الطول size_t على منصة الخاص بك ثم حدد واحد منهم:

if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64

وأقترح باستخدام stdint أنواع بدلا من أنواع البيانات الخام للتناسق.

كما أتذكر، فإن الطريقة الوحيدة المحمولة للقيام بذلك، هي إلقاء النتيجة إلى "Unsign Long Int" واستخدامها %lu.

printf("sizeof(int) = %lu", (unsigned long) sizeof(int));

استخدم "٪ ZO" ل Off_t. (ثماني) أو "٪ zu" للحصول على عشري.

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