C 使用#define将值转换为字符串
我的任务是将浮点值或整数值转换为C中的字符串。我不能使用sprintf,因为我在嵌入式平台上工作。所以我想用这样的东西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的值是多少,预处理器指令在编译时解析。因此,你试图做的不会起作用 但是,您可以执行以下操作
#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';
}