Вопрос значения спецификатора формата в 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' : ' '));
^
Также обратите внимание, что между одинарными кавычками должен быть пробел, как показано над символом каретки, иначе это приведет к ошибке: пустая символьная константа.
В случае строковых литералов допускается пустая строка.