স্বাক্ষরযুক্ত স্বল্প প্রান্তের জন্য বিন্যাস নির্দিষ্টকরণকারী কী?


124

আমি নিম্নলিখিত প্রোগ্রাম আছে

#include <stdio.h>

int main(void)
{
    unsigned short int length = 10; 

    printf("Enter length : ");
    scanf("%u", &length);

    printf("value is %u \n", length);

    return 0;
}

যা gcc filename.cনিম্নলিখিত সংকেত জারি করে সংকলিত হয়েছে ( scanf()লাইনে)।

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

আমি তখন উল্লেখ করা C99 specification - 7.19.6 Formatted input/output functionsএবং কখন দৈর্ঘ্য সংশোধনকারীদের (যেমন ব্যবহার সঠিক বিন্যাসে সুনির্দিষ্টভাবে উল্লেখ করা বুঝতে পারিনি short, longসঙ্গে, ইত্যাদি) unsignedজন্য intডাটা টাইপ।

কি %uসঠিক সুনির্দিষ্টভাবে উল্লেখ করা unsigned short int? যদি তা হয় তবে আমি কেন উল্লিখিত সতর্কতা পাচ্ছি ?!

সম্পাদনা: বেশিরভাগ সময়, আমি চেষ্টা করছিলাম %uhএবং এটি এখনও সতর্কতা দিচ্ছিল।


2
printf("%u\n", (unsigned int)length); //সর্বদা কাজ করে, যেহেতু আপনি C99 স্পষ্টটি পড়েছেন সেগুলি গ্যারান্টি দেয় sizeof(short) <= sizeof(int)(তবে নীচে এই প্রশ্নের প্রকৃত উত্তর অবশ্যই খুব সুন্দর)
ফিলিপ

1
কাস্টের প্রয়োজন নেই; ডিফল্ট প্রচারগুলি এটির যত্ন নেয়।
আর .. গীটহাব বন্ধ করুন ICE

উত্তর:


155

"%h"সংশোধক ব্যবহার করে দেখুন :

scanf("%hu", &length);
        ^

আইএসও / আইইসি 9899: 201x - 7.21.6.1-7

নির্দিষ্ট করে যে নিম্নলিখিত d, i, o, u, x, X, বা n রূপান্তর নির্দিষ্টকরণটি সংক্ষিপ্ত বা স্বাক্ষরযুক্ত স্বল্প টাইপ পয়েন্টার সহ একটি যুক্তির ক্ষেত্রে প্রযোজ্য ।


47

কারণ scanf, আপনি %huযেহেতু কোনওটিতে একটি পয়েন্টার দিচ্ছেন তা আপনাকে ব্যবহার করা দরকার unsigned short। কারণ printf, unsigned shortডিফল্ট প্রচারের কারণে কোনও পাস করা অসম্ভব (এটির জন্য প্রচার করা হবে intবা তার unsigned intউপর নির্ভর করে intকমপক্ষে আরও কয়েকটি মান বিট রয়েছে কি না তার উপর নির্ভর করে unsigned short) তাই %dবা %uঠিক আছে। আপনি %huযদি পছন্দ করেন তবে আপনি নির্দ্বিধায় রয়েছেন।


7

লিনাক্স ম্যানুয়াল পৃষ্ঠা থেকে:

h নীচের সংখ্যার রূপান্তরটি একটি সংক্ষিপ্ত অন্তর্নিহিত বা স্বাক্ষরযুক্ত শর্ট ইন্ট আর্গুমেন্টের সাথে সামঞ্জস্য, বা একটি ফল
       lowing n রূপান্তরটি একটি সংক্ষিপ্ত int আর্গুমেন্টের সাথে একটি পয়েন্টারের সাথে মিলে যায়।

সুতরাং একটি স্বাক্ষরযুক্ত স্বল্প পূর্ণসংখ্যা মুদ্রণের জন্য, বিন্যাসের স্ট্রিংটি হওয়া উচিত "%hu"


আমি মনে করি না যে আপনি "প্রিন্টফ" শর্ট ইনটগুলি কেননা সেগুলি স্বয়ংক্রিয়ভাবে ইনসে উন্নীত হয় (ঠিক অক্ষরের মতো)।
আলেক্সি ফ্রুঞ্জ

2
প্রিন্টফে @ অ্যালেক্স% হু /% এইচডি কাজ করে। এটি% hhu /% hhd ছিল যা কেবলমাত্র C99 দিয়ে শুরু হবে। % h এবং% hh একটি & 0xFFFF রেফারেন্স বোঝায়। পাস করা পূর্ণসংখ্যার উপর 0xFF।
jørgensen

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