C 使用#define将值转换为字符串

C 使用#define将值转换为字符串,c,c-preprocessor,C,C Preprocessor,我的任务是将浮点值或整数值转换为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。但是我得到了萨巴 我做错了什么 它只知道运行时a和b的值是多少,预处理器指令在编译时解析。因此,你试图做的不会起作用 但是,您可以执行以下操作

我的任务是将浮点值或整数值转换为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
。但是我得到了萨巴


我做错了什么

它只知道运行时a和b的值是多少,预处理器指令在编译时解析。因此,你试图做的不会起作用

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

#define CURRENT(STRING,S_NO,VALUE) sprintf(STRING, "S%i%iA", S_NO, VALUE)
或者只是让它成为一个函数


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

宏在编译之前进行评估,因此
CURRENT(str,a,b)
使用变量名
a
b
展开,而不是仅在运行时可用的值

要在运行时不使用etc将
int
转换为
char
数组,请使用etc(如果可用),或者可以编写如下函数(未测试!)

#定义最大整数字符串字节(11)
void IntToString(int val,char*str)
{
字符反转[最大整数字符串字节]
int指数,i=0;
布尔阴性=假;
如果(val==0){
*str++=“0”;
*str='\0';
返回;
}
if(val<0){
负=真;
}
while(val!=0){
反向[index++]=(char)('0'+abs(val%10));
val/=10;
}
如果(否定){
*str++='-';
}
对于(i=索引;i>0;i--){
*str++=reversed[i-1]);
}
*str='\0';
}

C预处理器在编译时运行。当你定义东西时,你不是在做一个函数。
itoa
是非标准的(仅限win),而且是一个非常糟糕的api。始终使用
snprintf
@R。。谢谢,我还没意识到只有窗户。OP无法使用
sprintf
,因此我猜这会让他使用我建议的代码的一些变体。。。
#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';
}