2013-10-23 54 views
1

取代我目前不知道是否有一種方法,通過什麼用的sprintf來代替格式說明%Usprintf的格式說明通過什麼

我的問題是關於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

什麼用if語句是怎麼回事? – Sneftel

+0

我會說什麼,但使用三元運算符將避免多個sprintf行(例如,如果有多個變量來測試...)。 – Joze

+1

不,你不能,而且你的'scanf'格式對於那種類型是錯誤的。 – interjay

回答

2

我認爲一個簡單的if聲明仍是最乾淨的選項:

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

if (n > 0) { 
    snprintf(mytab, sizeof mytab, "\"%" PRIu32 "\"", n); 
} 
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","") ; 
+0

不起作用,這將不打印數字'我'。你使用'*'會導致未定義的行爲,因爲你沒有爲它傳遞一個值。 – interjay

+0

同意interjay我想打印我的價值。對不起,如果我的問題不清楚。 – Joze

+0

@interjay修改了我的答案。感謝指點。 – Gangadhar

1

你可能(不?)喜歡用這種卑鄙的手段* 1(這使得GCC嚷嚷out警告):

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明確提及:「dir ty「在這種情況下暗示這可能會調用神話般的未定義行爲。所以不要這樣做在生產!


理智apporach是做:

... 

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

請注意,儘管數字在十進制格式的無符號的32位號碼的最大數量是10,你仍然需要保留一個字符爲0-終止符。

+0

還要注意'%u'不是'uint32_t'的合適格式說明符(我認爲這就是OP的意思) – 2013-10-23 14:47:39

+0

@ H2CO3:謝謝更正 – alk

+0

不用客氣 – 2013-10-23 15:04:45

3

我想你應該把三態運算符放在格式字符串上,根據i的值選擇使用"%u"""

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

+1以獲得最緊密的解決方案。 (也許使用PRIu32) – chux

+1

不錯,因爲「乾淨」。但是,如果這是關於緊密度的話:'sprintf(mytab,i?「%PRIu32:」「,i); printf(「\」%s \「」,mytab);' – alk

+1

@abelenky:一般情況下爲真,但OP指定'i'爲無符號。 – alk