Mam następujący program
#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;
}
Który po skompilowaniu przy użyciu wygenerował gcc filename.c
następujące ostrzeżenie (w scanf()
linii).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Potem przekazał C99 specification - 7.19.6 Formatted input/output functions
i przy użyciu modyfikatorów długość (jakby nie mógł zrozumieć, poprawny format specyfikatora short
, long
itp) z unsigned
dla int
typu danych.
Czy %u
właściwy specyfikator unsigned short int
? Jeśli tak, dlaczego otrzymuję powyższe ostrzeżenie ?!
EDYCJA: Przez większość czasu próbowałem %uh
i nadal dawało ostrzeżenie.
printf("%u\n", (unsigned int)length); //
zawsze działa, ponieważ specyfikacja C99, którą czytasz, gwarantuje tosizeof(short) <= sizeof(int)
(ale rzeczywiste odpowiedzi na to pytanie poniżej są oczywiście o wiele ładniejsze)Odpowiedzi:
Spróbuj użyć
"%h"
modyfikatora:źródło
Dla
scanf
, trzeba użyć%hu
ponieważ jesteś przechodzącą wskaźnik dounsigned short
. Naprintf
, że to niemożliwe, aby zdaćunsigned short
z powodu braku promocji (będzie promowany naint
lubunsigned int
w zależności od tego, czyint
ma co najmniej tyle bitów wartość jakounsigned short
lub nie), więc%d
czy%u
jest w porządku. Możesz jednak używać,%hu
jeśli wolisz.źródło
Ze strony podręcznika Linux:
Aby więc wydrukować krótką liczbę całkowitą bez znaku, łańcuch formatu powinien mieć postać
"%hu"
.źródło
Oto dobra tabela dla
printf
specyfikatorów. Tak powinno być%hu
zaunsigned short int
.I link do Wikipedii „Typy danych C” .
źródło