簡體   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