-2

我的任务是将浮点或整数值转换为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

我在这里做错了什么?

4

2 回答 2

3

宏在编译之前进行评估,因此CURRENT(str,a,b);使用变量名称而不是它们的值进行扩展,a这些b值可能仅在运行时可用。

要在运行时将 an 转换intchar数组而不使用sprintfetc。如果可用,请使用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';
}
于 2013-02-01T15:43:57.510 回答
2

它只知道 a 和 b 在运行时的值是什么,而预处理器指令在编译时被解析。因此,您尝试做的事情将行不通。

但是,您可以执行以下操作:

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

或者只是让它成为一个功能。

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

于 2013-02-01T15:41:57.683 回答