我的任务是将浮点或整数值转换为C中的字符串。因为我在嵌入式平台上工作,所以我不能使用 sprintf。所以我想用这样的东西。
#define CURRENT(STRING,S_NO,VALUE) (str = "S"#S_NO#VALUE"A")
并像这样调用它
int a=10,b=20;
CURRENT(str,a,b);
所以 str 应该是S1020A
. 但我越来越SabA
。
我在这里做错了什么?
我的任务是将浮点或整数值转换为C中的字符串。因为我在嵌入式平台上工作,所以我不能使用 sprintf。所以我想用这样的东西。
#define CURRENT(STRING,S_NO,VALUE) (str = "S"#S_NO#VALUE"A")
并像这样调用它
int a=10,b=20;
CURRENT(str,a,b);
所以 str 应该是S1020A
. 但我越来越SabA
。
我在这里做错了什么?
宏在编译之前进行评估,因此CURRENT(str,a,b);
使用变量名称而不是它们的值进行扩展,a
这些b
值可能仅在运行时可用。
要在运行时将 an 转换int
为char
数组而不使用sprintf
etc。如果可用,请使用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';
}
它只知道 a 和 b 在运行时的值是什么,而预处理器指令在编译时被解析。因此,您尝试做的事情将行不通。
但是,您可以执行以下操作:
#define CURRENT(STRING,S_NO,VALUE) sprintf(STRING, "S%i%iA", S_NO, VALUE)
或者只是让它成为一个功能。
或者直接调用 sprintf 而不是 CURRENT。