在整数前添加前导零无法正常工作(Arduino,C语言)

3

我希望将数字12转换为0012,以便数字始终为4个字符长度。我尝试使用以下代码:

int number;
int result;

void setup() {
    number = 12;
    Serial.begin(9600);
    result = printf("%03d", number);
}

void loop() {
    Serial.println(result);
}
然而,这段代码输出的是-1,而不是0012。这段代码有什么问题?
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
8

整数不能识别前导零等格式。

存储这种类型的信息的唯一方法是使用字符串(例如 char[] 而不是整数),但是看起来您只是写出该值,因此您不需要一个变量来存储它(因为 printf() 将为您处理)。

// %04d% will pad your number to 4 digits
printf("%04d", number);
如果您确实需要存储您的值,您可以使用 sprintf() ,并将您的 result 声明如下:
int number;
char *result = malloc(5);

然后在你的setup()函数中将其设置如下:

sprintf(result, "%04d", number);
使用这两个改变后,你的更新后的代码可能如下所示:
int number;
char *result = malloc(5);

void setup() {
    number = 12;
    Serial.begin(9600);
    sprintf(result, "%04d", number);
}

void loop() {
    Serial.println(result);
}
考虑在输出值时进行格式化,否则您可以使用整数值执行任何算术和计算。

这个问题最初被标记为 C#。然而,基本思路仍然保持不变。result 需要是一个字符串而不是整数。 - Rion Williams
啊,好的。谢谢你!有没有可能用整数来做到这一点? - manIneedHelp
1
正如我所提到的,整数不能保存任何类型的格式信息,其中前导零将符合条件。真正的问题是你是否需要一个变量来存储结果,还是只是输出它?如果是这种情况,那么你不需要定义“result”或将其设置为你的“printf()”调用的值。 - Rion Williams
1
你想要为尾随的NUL使用malloc(5) - David Ranieri
谢谢Alter,我的C语言有点生疏了,我完全忘记了那个。我已经相应地更新了代码。 - Rion Williams

4
代码的问题在于你正在打印'printf'调用的返回值,它返回已打印的字符数。由于看起来stdio尚未设置,它作为错误标志返回-1。认真再次阅读手册页面。 在这一行上:
result = printf("%03d", number);

我们希望使用'sprintf'而不是'printf'。

'sprintf'需要放置它的输出字符串。可以预先分配它,确保它比最长的输出字符串加一更大(以容纳终止的空字符)。请勿在'setup'内部分配它,而是将其放在任何例程之外(因为您在一个例程中初始化它,并在另一个例程中使用它)。

char buf[6];

r = sprintf(buf, "%04d", number);

// now print the string inside of 'buf'
Serial.println(buf);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,