我目前想知道是否有办法用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。
您对此有任何想法或解释吗?先谢谢。
答案 0 :(得分:3)
我认为您应该将三元运算符放在format-string上,选择使用"%u"
或""
,具体取决于i的值。
sprintf(mytab, i? "\"%u\"" : "\"\"", i);
答案 1 :(得分: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","") ;
答案 2 :(得分:2)
我认为一个简单的if
语句仍然是最干净的选择:
char mytab[10] = "\"\"";
if (n > 0) {
snprintf(mytab, sizeof mytab, "\"%" PRIu32 "\"", n);
}
答案 3 :(得分: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
- 终结符保留一个字符。