Предупреждение компилятора при использовании `% * s` с` printf` - PullRequest
2 голосов
/ 20 сентября 2011

Когда я компилирую следующее:

printf("%*s",lengths[i],row[i]);

Я получаю это предупреждение:

4.0.c:407: warning: field width should have type ‘int’, but argument 2 has type 
‘long  unsigned int’

длина объявлена ​​как: unsigned long *lengths;.

Я пытался решить проблему, но безрезультатно. Добавляя это,

printf("%*lu",(unsigned long)lengths[i],row[i]);

Я больше не получаю предупреждений, но код не работает должным образом.

Спасибо, Вера

Ответы [ 5 ]

8 голосов
/ 20 сентября 2011

Приведите его к int:

printf("%*s", (int) lengths[i], row[i]);
2 голосов
/ 20 сентября 2011

Убедитесь, что значение не превышает INT_MAX, и приведите его к int, чтобы согласиться со звездочкой в ​​спецификаторе преобразования printf

printf("%*s", (int)lengths[i], row[i]);

См. 7.19.6.1/5 в стандарте C99 :

... аргумент int задает ширину поля или точность ...

2 голосов
/ 20 сентября 2011

Это правильный способ печати:

printf("%*s", (int) lengths[i], row[i]);

В соответствии с http://en.wikipedia.org/wiki/Printf#Format_placeholders:

* - Вызывает printf для заполнениявыводите до ширины n символов, где n - это целочисленное значение , сохраненное в аргументе функции, предшествующем аргументу, представленному измененным типом.Например, printf("%*d", 5, 10) приведет к тому, что "10" будет напечатано с шириной 5.

Так что, если lengths не используется для чего-то другого, также требуется, чтобы это было unsigned long Iпредложил бы превратить его в int *lengths.

0 голосов
/ 20 сентября 2011

Чтобы убедиться, что я понимаю, что вы пытаетесь сделать, вы хотите напечатать row[i] в виде строки с шириной поля, заданной lengths[i]?

Если это так, вам нужнодля приведения значения lengths[i] к int:

printf("%*s", (int) lengths[i], row[i]);

Если это , а не , что вы пытаетесь сделать, то вам нужно обновить свой вопрос с дополнительной информацией.

0 голосов
/ 20 сентября 2011

используйте вот так ... printf("%*ul", (int) lengths[i], row[i]);

...