Що таке специфікатор формату для неподписаного короткого 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? Якщо так, чому я отримую вищезазначене попередження ?!

EDIT: Більшість випадків я намагався, %uhі це все ще дало попередження.


2
printf("%u\n", (unsigned int)length); //завжди працює, оскільки специфікація C99, яку ви читаєте, гарантує це sizeof(short) <= sizeof(int)(але фактичні відповіді на це питання, звичайно, набагато приємніші)
Філіп

1
Немає потреби в ролях; акції за замовчуванням подбайте про це.
R .. GitHub ЗАСТОСУЄТЬСЯ ДІЙСНЯ

Відповіді:


155

Спробуйте скористатися "%h"модифікатором:

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

ISO / IEC 9899: 201x - 7.21.6.1-7

Вказує, що наступний специфікатор перетворення d, i, o, u, x, X або n застосовується до аргументу з вказівником типу на короткий або неподписаний короткий .


47

Для цього scanfвам потрібно скористатися, %huоскільки ви передаєте вказівник на an unsigned short. Бо printfнеможливо пропустити unsigned shortчерез акції за замовчуванням (вона буде просуватися до intабо unsigned intзалежно від того, intмає принаймні стільки бітів значення unsigned shortчи ні), так %dчи %uце нормально. Ви можете користуватися, %huякщо хочете.


7

На сторінці керівництва Linux:

h Наступне ціле перетворення відповідає короткому int або непідписаному короткому int аргументу, або fol -
       конверсія пониження n відповідає вказівнику на короткий аргумент int.

Отже, щоб надрукувати ненаписане коротке ціле число, має бути рядок формату "%hu".


Я не думаю, що саме так ви «друкуєте» короткі вставки, тому що вони автоматично переходять до int (як і символи).
Олексій Фрунзе

2
@ Алекс% hu /% hd у printf справді працює. Це був% hhu /% hhd, який доступний лише починаючи з C99. % h і% hh означають & 0xFFFF відповідність & 0xFF на передане ціле число.
jørgensen

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.