繁体   English   中英

sprintf格式说明符不替换任何内容

[英]sprintf format specifier replace by nothing

我目前在想是否有办法使用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,则为“”。

您对此有什么想法或看法吗? 预先感谢。

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

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

修改此语句

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

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

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

if (n > 0) {
    snprintf(mytab, sizeof mytab, "\"%" PRIu32 "\"", n);
}

您可能(不是?)喜欢使用这个肮脏的把戏* 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明确提及这一点:在此上下文中,“脏”是暗示这可能会调用神话般的Undefined Behaviour。 因此, 请勿在生产中这样


理智的方法是:

...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM