C 根据变量的值更改printf()中的文本

C 根据变量的值更改printf()中的文本,c,printf,C,Printf,我已经很长一段时间没有做C了,慢慢地又开始做了。我做了一个小游戏,现在正在进行“bug修复”和一些奇怪的调整。如果printf() printf("CONGRATULATIONS!!\nYou won with %d turns remaining\n",turns); 现在这很好,直到转动==1 是否有一种有效的方法根据turns变量的条件更改文本“turns”?或者我必须使用if语句(我已经有了一个解决方案,但我确信还有更好的解决方案!) 很抱歉,我提出了一个真正的“noob”问题,但我一

我已经很长一段时间没有做C了,慢慢地又开始做了。我做了一个小游戏,现在正在进行“bug修复”和一些奇怪的调整。如果
printf()

printf("CONGRATULATIONS!!\nYou won with %d turns remaining\n",turns);
现在这很好,直到
转动==1

是否有一种有效的方法根据turns变量的条件更改文本“turns”?或者我必须使用if语句(我已经有了一个解决方案,但我确信还有更好的解决方案!)

很抱歉,我提出了一个真正的“noob”问题,但我一直想知道什么才是最有效的方法。

使用

printf("CONGRATULATIONS!!\nYou won with %d turn%s remaining.\n", 
  turns, 
  turns==1 ?"" :"s");
还是就这么做

printf("CONGRATULATIONS!!\nYou won with %d turn(s) remaining.\n",
  turns);

;-)

注意国际化(I18N),但对于英语,您可以在
printf上使用变体(“祝贺您:您以%d%s左\n”赢得了比赛,回合数,(回合数==1)?“回合数”:“回合数”)。有了I18N,您可能会使用两个单独的消息字符串,并担心是否有语言对1以外的其他数字(与其他任何数字相比)有不同的处理方式。零圈可能是个问题。有些语言有如此有趣的规则,但现在不记得是哪一种了。@JonathanLeffler。Matra如果在glibc上,您可以使用
gettext
。谢谢,@AnttiHaapala。虽然这不是我记忆中的来源,但它涵盖了比我记忆中更多的可能性。如果做得好,I18N很难。(顺便说一句,我注意到POSIX的函数系列在识别参数位置时使用
n$
而不是
$n
gettext
的手册包括示例
printf(ngettext(“%从目录%$1s删除的%$2d文件”,“从目录%$1s删除的%$2d文件”,n),dir,n)
哪个应该使用
%1$s
而不是
%$1s
来符合POSIX。它与GNU一起工作吗?@JonathanLeffler您是对的,文档是错的。甚至gcc也会抱怨
-Wformat
,输出是
%$2d文件从目录%$1s%
@AnttiHaapala中删除:我刚刚通过电子邮件向页面底部的两个邮件地址报告了问题。谢谢你检查/确认我是对的。太好了,真/假的用法很好。我本可以用后者,但我是一个完美主义者,不会用转身(s):-P谢谢你的帮助!我完全同意,这也是我刚开始时的一个问题。当然你的答案是理想的,因此我会投票给你的另一个答案,我喜欢。
printf("CONGRATULATIONS!!\nYou won with %d turn(s) remaining.\n",
  turns);