C - sprintf 格式说明符替换为 nothing



我目前想知道是否有办法使用 sprintf 将格式说明符 %u 替换为任何内容

我的问题是关于在 sprintf 中使用三元运算符,它将用值或什么都没有替换 %u。

这是我正在尝试做的事情的一个例子:

int main (void)
{
   char mytab[10]={''};
   uint_32 i=0;
   scanf("%u",&i);
   sprintf(mytab, ""%u"",i>0?i:/*Here is the syntax I want to find if it exists*/);
   printf("%srn",mytab);
   return 0;
}
例如,如果输入为 1,

我尝试获取的代码的结果是"1"(如果输入为 2...,则为"2"),如果输入为 0,则为"

"。

你对此有什么想法或解释吗?提前感谢。

我认为您应该将三元运算符放在格式字符串上,选择使用 "%u""" ,具体取决于 i 的值。

sprintf(mytab, i? ""%u"" : """", i);

我认为一个简单的if语句仍然是最干净的选择:

char mytab[10] = """";
if (n > 0) {
    snprintf(mytab, sizeof mytab, ""%" PRIu32 """, n);
}

修改此语句

sprintf(mytab, ""%u"",i>0?i:/*Here is the syntax I want to find if it exists*/);  

这就是你所需要的。

 (i>0)? sprintf(mytab, "%u",i) : sprintf(mytab,"%s","") ;

编辑

正如 H2CO3 建议的那样

您也可以通过这种方式使用。

if (i > 0)  
sprintf(mytab, "%"PRIu32, i); 
else
sprintf(mytab,"%s","");   

另请注意,%u 不是适合uint32_t的格式说明符,请使用 "%"PRIu32

(i>0)? sprintf(mytab, "%"PRIu32,i) : sprintf(mytab,"%s","") ;  

你可能(不是?)喜欢使用这个肮脏的技巧*1(这让gcc大喊警告):

char mytab[11] = ""; 
uint32_t i = 0;
int result = scanf("%"SCNu32, &i);
if (1 != result)
{
  if (-1 == result)
  {
    if (errno)
    {
      perror("scanf() failed");
    }
    else
    {
      fprintf(stderr, "EOF reachedn");
    }
  }
  else
  {
    fprintf(stderr, "invalid inputn");
  }
}
sprintf(mytab, i>0 ?"%"PRIu32 :"%s", i>0 ?i :"");
printf("%s", mytab);

*1 明确提及这一点:"肮脏"在这种情况下暗示这可能会引发神话般的未定义行为。所以不要在生产中这样做!


理智的分配是:

...
if (i)
{
  sprintf(mytab, "%"PRIu32, i);
}
printf("%s", mytab);

请注意,尽管十进制格式的无符号 32 位数字的最大位数为 10,但您仍然需要为0 -terminator 保留一个字符。

最新更新