我的任務是將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
。
我在這裏做錯了什麼?
我的任務是將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
。
我在這裏做錯了什麼?
它只知道在運行時a和b的值是什麼,並且在編譯時解析預處理器指令。因此你試圖做的事情是行不通的。
但是,您可以這樣做:
#define CURRENT(STRING,S_NO,VALUE) sprintf(STRING, "S%i%iA", S_NO, VALUE)
或者只是使它成爲一個功能。
或者直接調用sprintf而不是CURRENT。
在編譯之前對宏進行評估,因此使用變量名a
和b
擴展了CURRENT(str,a,b);
,而不是僅在運行時可用的值。
要在運行時轉換的int
爲char
陣列,而不使用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';
}
'itoa'是非標準的(只贏)和非常糟糕的api。總是使用'snprintf'。 –
@R ..謝謝,我沒有意識到它只是Windows。 OP不能使用'sprintf',所以我想這給他留下了一些我的建議代碼的變體...... – simonc
C預處理程序在編譯時運行的函數。當你定義一些東西的時候,你並沒有發揮作用。 – cha0site