अहस्ताक्षरित लघु int के लिए प्रारूप विनिर्देशक क्या है?


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 एक निम्नलिखित पूर्णांक रूपांतरण एक छोटे int या अहस्ताक्षरित लघु int तर्क या एक fol conversion से मेल खाता है
       कम एन रूपांतरण एक सूचक के लिए एक छोटे से अंतर तर्क से मेल खाता है।

तो एक अहस्ताक्षरित लघु पूर्णांक प्रिंट करने के लिए, प्रारूप स्ट्रिंग होना चाहिए "%hu"


मुझे नहीं लगता है कि आप शॉर्ट प्रिंट्स को "प्रिंटफ" कैसे करते हैं क्योंकि वे स्वचालित रूप से प्रिंट्स (चार्ट की तरह) को बढ़ावा देते हैं।
एलेक्सी फ्रुंज़े

2
प्रिंट में @Alex% hu /% HD काम करता है। यह% hhu /% hhd था जो केवल C99 से शुरू होता है। % h और% hh का तात्पर्य a & 0xFFFF सम्मान है। & पूर्णांक पूर्णांक पर 0xFF।
jørgensen

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.