我的任务是将浮点数或整数值转换为 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
。
我在这里做错了什么?
答案 0 :(得分:3)
在编译之前评估宏,以便使用变量名CURRENT(str,a,b);
和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';
}
答案 1 :(得分:2)
它只知道a和b在运行时的值,并且在编译时解析预处理器指令。因此,您尝试做的事情将无法奏效。
但你可以这样做:
#define CURRENT(STRING,S_NO,VALUE) sprintf(STRING, "S%i%iA", S_NO, VALUE)
或者只是让它成为一种功能。
或者直接调用sprintf而不是CURRENT。