c中的格式说明符值问题

format specifier value issue in c

int friends = 20;

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

return 0;

所以每当我运行它调试到这个

的代码
I have 20 friend$

当我 运行 它在 friend 之后使用 %s 格式说明符时它工作正常。 s 只有一个字符,为什么不起作用?

为什么它不起作用? 因为 %c 期望 char 但表达式 (friends !=1 ? "s" : "") 导致字符串(双引号)。所以要么使用 %s like

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

将return字符串文字,因为

"s" or " " 

是字符串文字,printf( ) 需要格式指定“%s”来打印它们。

如果您想在代码片段中使用 %c 格式说明符,则使用字符常量 's' 而不是字符串文字 "s"

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

另请注意,单引号之间必须有一个 space,如插入符号上方所示,否则会出现 错误:空字符常量。
在字符串文字的情况下,允许空字符串。