uint32_t এবং আকার_t এর জন্য মুদ্রণযোগ্য ফর্ম্যাট নির্দিষ্টকরণ


101

আমি নিম্নলিখিত আছে

size_t   i = 0;
uint32_t k = 0;

printf("i [ %lu ] k [ %u ]\n", i, k);

সংকলনের সময় আমি নিম্নলিখিত সতর্কতাটি পাই:

format ‘%lu expects type long unsigned int’, but argument has type uint32_t

আমি যখন স্প্লিন্ট ব্যবহার করে এটি চালিয়েছি তখন নিম্নলিখিতগুলি পেয়েছিলাম:

Format argument 1 to printf (%u) expects unsigned int gets size_t: k

কোন পরামর্শের জন্য অনেক ধন্যবাদ,


2
C89 বা uint32_tথেকে সমর্থন করে না ; আপনি যদি এই ধরণের ব্যবহার করতে চান তবে আপনার C89 এ আপগ্রেড করা উচিত। এক্সটেনশান হিসাবে, সম্ভবত জিসিসি আপনাকে সেগুলি ব্যবহারের অনুমতি দেয়, তবে সি 89 এর মতো কোনও সমর্থন নেই support <stdint.h><inttypes.h>
জোনাথন লেফলার

10
আর অফিসিয়াল সি 99 ফর্ম্যাট সংশোধকটি size_tহ'ল 'জেড' "%zu"
জোনাথন লেফলার


আমি বিশ্বাস করি @ কেনির উত্তরটি সবচেয়ে ভাল uint32_t, তবে এর অভাব রয়েছে size_t। @ u0b34a0f6ae এর উত্তরে উভয়ই অন্তর্ভুক্ত রয়েছে।
jww

জোনাথন লেফলারের 1 ম মন্তব্যে সি
89 এর

উত্তর:


28

মনে হচ্ছে আপনি যখন এটি (32 বিট) আসলে একটি size_tহিসাবে unsigned longসম্ভবত (সম্ভবত 64 বিট) একই হবেন বলে মনে করছেন unsigned int%zuউভয় ক্ষেত্রে ব্যবহার করার চেষ্টা করুন ।

যদিও আমি পুরোপুরি নিশ্চিত নই।


1
সংকলনের সময় কোনও সতর্কতা নেই। যাইহোক, স্প্লিন্ট চালিয়ে আমি নিম্নলিখিতটি পেয়েছি: 1) প্রিন্টফ (% u) স্বাক্ষরিত প্রতীকটি uint32_t পাওয়ার প্রত্যাশা করে: i 2) প্রিন্টফ (% u) স্বাক্ষরিত প্রত্যাশিত
আকারের আকার

স্প্লিন্টের মতো শব্দগুলি কেবলমাত্র পেডেন্টিক হচ্ছে। এটি সম্ভবত সোর্স কোডের ধরণের নামগুলি ছাড়ছে এবং বুঝতে পারে না যে তারা সমতুল্য। আমি অবাক হয়েছি কেনেটিএম এর উত্তর দিয়ে এটি কী করবে ... এটি অবশ্যই আরও বহনযোগ্য হতে হবে।
কগওহিল

3
স্প্লিন্ট আসলে সঠিক জিনিস করছে। শুধু কারণ int32_tহতে হবে intআপনার কম্পাইলার উপর / প্ল্যাটফর্ম মানে এই নয় এটা নাও হতে পারে longঅন্য। একই জন্য size_t। এটি প্রকৃতপক্ষে তার পথ ছাড়ছে এবং এই পোর্টেবিলিটি বাগটি সনাক্ত করার জন্য আরও বেশি কাজ করছে যেহেতু সহজ, প্রাকৃতিক চেকটি কেবল সংক্ষেপকারীর মতো টাইপডেফকে সম্মান জানায়।
আর .. গীটহাব থামিয়ে দিন ICE

4
-1, দুঃখিত, এটি পোর্টেবল নয়। ফর্ম্যাট স্পেসিফায়ার এবং প্রকারগুলি একমত হওয়ার জন্য যা প্রয়োজন তা হ'ল এবং এটি সত্য করতে আপনি সর্বদা কাস্ট করতে পারেন। দীর্ঘতম কমপক্ষে 32 বীট হয়, তাই %luএকসাথে (unsigned long)kসবসময় সঠিক। size_tকৌতুকপূর্ণ, তাই %zuসি 99 এ যুক্ত করা হয়েছিল। যদি আপনি এটি ব্যবহার করতে না পারেন, তবে ঠিক এটির মতোই চিকিত্সা করুন k( longসি 98 এর মধ্যে সবচেয়ে বড় ধরণের, এর size_tচেয়ে বড় হওয়ার সম্ভাবনা খুব কম)।
u0b34a0f6ae

139

চেষ্টা

#include <inttypes.h>
...

printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);

zদৈর্ঘ্য হিসাবে একই এর একটি পূর্ণসংখ্যা প্রতিনিধিত্ব করে size_t, এবং PRIu32ম্যাক্রো, C99 হেডার সংজ্ঞায়িতinttypes.h , একটি স্বাক্ষরবিহীন 32 বিট পূর্ণসংখ্যা প্রতিনিধিত্ব করে।


3
@ আরবুক: হি। আমি আপনাকে বিভক্ত করার জন্য একটি বাগ ফাইল করার পরামর্শ দিচ্ছি।
কেনেটিএম

8
এটি সঠিক উত্তর। যদিও আমার ব্যক্তিগত সুপারিশটি কেবল কাস্ট করা, যেমন printf( "%lu", (unsigned long )i )। অন্যথায় এক পরে এক ধরণের পরিবর্তনের কারণে সমস্ত কোডে সতর্কতার গাদা দিয়ে শেষ হয়।
ডমি 100001

1
এটা সঠিক উত্তর. আমি স্প্লিন্টের জন্য বাগ ফাইল করার বিষয়ে কেনিটিএম এর সাথে একমত। যাইহোক, "% zu" মাপ_টি জন্য উপযুক্ত বিন্যাস। আকার_t মুদ্রণের জন্য আপনার কোনও পিআরআই * ম্যাক্রোগুলোর প্রয়োজন নেই।
আর .. গীটহাব বন্ধ করুন ICE

1
যদি আমি মনে করি সঠিকভাবে% zu হল C99, এবং প্রশ্নে তিনি লিখেছেন 'সি 89'।
alcor

8
@ আলকর হ্যাঁ তিনি সি 98 রেখেছিলেন (স্পষ্টতই তিনি ব্যবহার করছেন জিসিসি সংকলক পতাকা) তবে তিনি ব্যবহার করছেন uint32_tআসলে এটি সি 99 কোড, এবং এর মতো সংকলন করা উচিত।
কলিন ডি বেনেট

28

ফর্ম্যাট স্পেসিফায়ার এবং প্রকারগুলি একমত হওয়ার জন্য যা প্রয়োজন তা হ'ল এবং এটি সত্য করতে আপনি সর্বদা কাস্ট করতে পারেন। longকমপক্ষে 32 বিট হয় তাই %luএকসাথে (unsigned long)kসর্বদা সঠিক:

uint32_t k;
printf("%lu\n", (unsigned long)k);

size_tকৌতুকপূর্ণ, তাই %zuসি 99 এ যুক্ত করা হয়েছিল। যদি আপনি এটি ব্যবহার করতে না পারেন, তবে ঠিক এটির মতোই চিকিত্সা করুন k( longসি 98 এর মধ্যে সবচেয়ে বড় ধরণের, এর size_tচেয়ে বড় হওয়ার সম্ভাবনা খুব কম)।

size_t sz;
printf("%zu\n", sz);  /* C99 version */
printf("%lu\n", (unsigned long)sz);  /* common C89 version */

আপনি যে ধরণের পাস করছেন সেটির জন্য যদি ফর্ম্যাট স্পেসিফায়ারগুলি সঠিক না পান printfতবে অ্যারের বাইরে খুব বেশি বা খুব কম মেমরি পড়ার সমতুল্য করবে। যতক্ষণ না আপনি প্রকারের সাথে মিলে যাওয়ার জন্য সুস্পষ্ট কাস্ট ব্যবহার করেন ততক্ষণ এটি পোর্টেবল।


17

আপনি যদি পিআরআই * ম্যাক্রো ব্যবহার করতে না চান তবে যে কোনও পূর্ণসংখ্যা টাইপ প্রিন্ট করার জন্য অন্য পদ্ধতি হ'ল যথাক্রমে কাস্ট করা intmax_tবা uintmax_tব্যবহার করা "%jd"বা or %juএটি POSIX (বা অন্যান্য ওএস) প্রকারের জন্য দরকারী যা উদাহরণস্বরূপ, পিআরআই * ম্যাক্রো সংজ্ঞায়িত হয় না off_t

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.