В чем разница между% d и% * d на языке c? - PullRequest
8 голосов
/ 30 марта 2012

Что такое %*d? Я знаю, что %d используется для integers, поэтому я думаю, что %*d также должно относиться только к целому числу? Какова цель этого? Что это делает?

int a=10,b=20;
printf("\n%d%d",a,b);
printf("\n%*d%*d",a,b);

Результат

10 20 
1775 1775 

Ответы [ 3 ]

17 голосов
/ 30 марта 2012

%*d в printf позволяет использовать переменную для управления шириной поля вдоль линий:

int wid = 4;
printf ("%*d\n", wid, 42);

, который даст вам:

..42

(каждый из этих . символов - пробел). * использует один аргумент wid, а d - 42.

Форма, которую вы имеете, например:

printf ("%*d %*d\n", a, b);

является неопределенным поведением согласно стандарту, поскольку вы должны предоставлять четыре аргумента после строки формата, а не два (и хорошие компиляторы, такие как gcc, сообщат вам об этом, если вы увеличите предупреждение уровень). От C11 7.20.6 Formatted input/output functions:

Если для формата недостаточно аргументов, поведение не определено.

Это должно быть что-то вроде:

printf ("%*d %*d\n", 4, a, 4, b);

И причина, по которой вы получаете странный вывод, связана с этим неопределенным поведением. Этот превосходный ответ показывает вам, что может пойти не так (и почему), если вы не следуете правилам, особенно в этой ситуации.

Теперь я не ожидал бы, что это будет проблемой смещения, так как вы используете int для всех типов данных, но, как и для любого неопределенного поведения, может произойти что угодно .

10 голосов
/ 30 марта 2012

При использовании с функциями scanf () это означает, что анализируется целое число, но результат нигде не сохраняется.

При использовании с функциями printf () это означает, что аргумент width определяется следующим аргументом формата.

5 голосов
/ 30 марта 2012

* используется как указание на то, что ширина передается как параметр printf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...