1

我目前想知道是否有一种方法可以使用 sprintf 替换格式说明符 %u

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

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

int main (void)
{
   char mytab[10]={'\0'};
   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("%s\r\n",mytab);

   return 0;
}

例如,如果输入为 1,则我尝试获取的代码结果为“1”(如果输入为 2,则为“2”......),如果输入为 0,则为“”。

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

4

4 回答 4

3

我认为您应该将三元运算符放在格式字符串上,根据 i 的值选择使用"%u"或。""

sprintf(mytab, i? "\"%u\"" : "\"\"", i);
于 2013-10-23T15:46:37.013 回答
2

修改此语句

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

编辑

AS 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","") ;  
于 2013-10-23T12:31:27.497 回答
2

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

char mytab[10] = "\"\"";

if (n > 0) {
    snprintf(mytab, sizeof mytab, "\"%" PRIu32 "\"", n);
}
于 2013-10-23T18:12:21.623 回答
1

你可能(不是?)喜欢使用这个肮脏的把戏*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 reached\n");
    }
  }
  else
  {
    fprintf(stderr, "invalid input\n");
  }
}

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终止符保留一个字符。

于 2013-10-23T12:43:37.807 回答