2013-02-01 45 views
-2

我的任務是將float或integer值轉換爲C中的字符串。由於我在嵌入式平臺工作,因此無法使用sprintf。所以我想用這樣的東西。使用#define將值轉換爲字符串

#define CURRENT(STRING,S_NO,VALUE) (str = "S"#S_NO#VALUE"A") 

並調用它像這樣

int a=10,b=20; 
CURRENT(str,a,b); 

所以STR應該是S1020A。但我得到SabA

我在這裏做錯了什麼?

+3

C預處理程序在編譯時運行的函數。當你定義一些東西的時候,你並沒有發揮作用。 – cha0site

回答

2

它只知道在運行時a和b的值是什麼,並且在編譯時解析預處理器指令。因此你試圖做的事情是行不通的。

但是,您可以這樣做:

#define CURRENT(STRING,S_NO,VALUE) sprintf(STRING, "S%i%iA", S_NO, VALUE) 

或者只是使它成爲一個功能。

或者直接調用sprintf而不是CURRENT。

3

在編譯之前對宏進行評估,因此使用變量名ab擴展了CURRENT(str,a,b);,而不是僅在運行時可用的值。

要在運行時轉換的intchar陣列,而不使用sprintf等如有,請使用itoa或者你可以編寫如下(未經測試!)

#define MAX_INT_STRING_BYTES (11) 

void IntToString(int val, char* str) 
{ 
    char reversed[MAX_INT_STRING_BYTES] 
    int index, i = 0; 
    bool negative = false; 
    if (val == 0) { 
     *str++ = '0'; 
     *str = '\0'; 
     return; 
    } 
    if (val < 0) { 
     negative = true; 
    } 
    while(val != 0) { 
     reversed[index++] = (char)('0' + abs(val % 10)); 
     val /= 10; 
    } 
    if (negative) { 
     *str++ = '-'; 
    } 
    for (i = index; i > 0; i--) { 
     *str++ = reversed[i - 1]); 
    } 
    *str = '\0'; 
} 
+1

'itoa'是非標準的(只贏)和非常糟糕的api。總是使用'snprintf'。 –

+0

@R ..謝謝,我沒有意識到它只是Windows。 OP不能使用'sprintf',所以我想這給他留下了一些我的建議代碼的變體...... – simonc