İşaretsiz kısa int için biçim belirticisi nedir?


125

Aşağıdaki programım var

#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;
}

Kullanılarak derlendiğinde gcc filename.caşağıdaki uyarı ( scanf()satırda) verdi.

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

Sonra sevk C99 specification - 7.19.6 Formatted input/output functionsve uzunluk düzenleyiciler (gibi kullanırken doğru biçimde belirtici anlayamadık short, longile, vs) unsignediçin intveri türü.

%udoğru belirteci unsigned short int? Öyleyse neden yukarıda belirtilen uyarıyı alıyorum ?!

DÜZENLEME: Çoğu zaman deniyordum %uhve hala uyarı veriyordu.


2
printf("%u\n", (unsigned int)length); //her zaman işe yarar, çünkü okuduğunuz C99 spesifikasyonu bunu garanti eder sizeof(short) <= sizeof(int)(ancak aşağıdaki soruya verilen gerçek cevaplar elbette çok daha güzeldir)
Philip

1
Oyunculara gerek yok; varsayılan promosyonlar bununla ilgilenir.
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

Yanıtlar:


156

"%h"Değiştiriciyi kullanmayı deneyin :

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

ISO / IEC 9899: 201x - 7.21.6.1-7

Aşağıdaki d, i, o, u, x, X veya n dönüşüm belirtecinin , kısa veya işaretsiz kısaya tür işaretçisi olan bir bağımsız değişken için geçerli olduğunu belirtir .


47

İçin scanf, %hubir unsigned short. Çünkü printf, unsigned shortvarsayılan promosyonlardan dolayı geçmek imkansızdır (terfi edilecektir intveya en az değer bitine sahip unsigned intolup olmamasına bağlı intolarak unsigned short) öyle %dveya %uiyidir. %huYine de tercih ederseniz kullanmakta özgürsünüz .


8

Linux kılavuz sayfasından:

h Bir sonraki tamsayı dönüşümü, kısa tamsayı veya işaretsiz kısa tamsayı bağımsız değişkenine veya bir fol‐
       lowing n dönüşümü, kısa int argümanına bir göstericiye karşılık gelir.

Dolayısıyla, işaretsiz kısa bir tamsayı yazdırmak için, biçim dizesi olmalıdır "%hu".


Bence bu şekilde kısalttığınızı sanmıyorum çünkü bunlar otomatik olarak ints'e yükseltilir (tıpkı karakter gibi).
Alexey Frunze

2
Printf'de @Alex% hu /% hd çalışıyor. Yalnızca C99 ile başlayan% hhu /% hhd idi. % h ve% hh, bir & 0xFFFF yanıtı anlamına gelir. & 0xFF aktarılan tamsayı üzerinde.
jørgensen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.