Вопрос значения спецификатора формата в c

int friends = 20;

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

return 0;

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

I have 20 friend$

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

2 ответа

Решение

так почему это не работает? так как %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' : ' '));

"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' : ' '));
                                                              ^  

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

Другие вопросы по тегам