【问题标题】:Convert value to string using #define使用#define 将值转换为字符串
【发布时间】:2013-02-01 15:37:45
【问题描述】:

我的任务是在 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 预处理器在编译时运行。当你 #define 事情时,你并没有在做一个函数。

标签: c c-preprocessor


【解决方案1】:

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

要在运行时将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 是非标准的(仅限win),无论如何都是一个非常糟糕的api。始终使用snprintf
  • @R.. 谢谢,我没有意识到它只是 Windows。 OP 无法使用sprintf,所以我想这会让他留下我建议的代码的一些变体......
【解决方案2】:

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

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

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

或者只是让它成为一个函数。

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

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 2019-07-15
    • 1970-01-01
    • 2012-11-02
    • 2013-08-17
    • 2012-05-19
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    相关资源
    最近更新 更多