вопрос значения спецификатора формата в c - PullRequest
0 голосов
/ 30 апреля 2018
int friends = 20;

printf("I have %d friend%c", friends , (friends !=1 ? "s" : ""));

return 0;

Поэтому, когда я запускаю код, он отлаживается в этом

I have 20 friend$

Работает нормально, когда я запускаю его со спецификатором формата% s после friend. s только один символ, так почему он не работает?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

"s" - это не один символ, это строковый литерал с типом char *
's' - это константа из одного символа, тип которой int.
Строковый литерал в C требует двойных кавычек, а printf () имеет спецификатор формата% s для печати строковых литералов.
Символьная константа в C требует одинарных кавычек, а printf () имеет спецификатор формата% c для их печати. ​​

Теперь ваш код,

printf("I have %d friend%c", friends , (friends != 1 ? "s" : ""));

вернет строковый литерал, поскольку

"s" or " " 

является строковым литералом, а printf () требует, чтобы формат определял "% s" для их печати.

если вы хотите использовать спецификатор формата% c в фрагменте кода, тогда используйте символьную константу 's' вместо строкового литерала "s"

printf("I have %d friend%c", friends , (friends != 1 ? 's' : ' '));
                                                              ^  

Также обратите внимание, что между одинарными кавычками должен быть пробел, как показано над символом каретки, иначе это приведет к ошибке : пустая символьная константа.
В случае строковых литералов допускается пустая строка.

0 голосов
/ 30 апреля 2018

так почему же это не работает? , потому что %c ожидает char, но выражение (friends !=1 ? "s" : "") приводит к строкам (двойные кавычки). Так что либо используйте %s как

printf("I have %d friend%s", friends , (friends !=1 ? "s" : ""));

или

Заменить "s" на 's' и "" на ' ', поскольку %c ожидает char.

printf("I have %d friend%c", friends , (friends !=1 ? 's' : ' '));
...