我有一个控制计时器的Arduino。定时器的设置存储在字节数组中。我需要将数组转换为字符串以在外部Redis服务器上设置字符串。
所以,我有许多不同长度的字节数组,我需要转换为字符串作为参数传递给期望char[]
的函数。我需要用逗号分隔值并以' \ 0'。
byte timer[4] {1,5,23,120};
byte timer2[6] {0,0,0,0,0,0}
我已成功使用sprintf()
像这样
char buf[30];
for (int i=0;i<5;i++){ buf[i] = (int) timer[i]; }
sprintf(buf, "%d,%d,%d,%d,%d",timer[0],timer[1],timer[2],timer[3],timer[4]);
这给了我一个输出字符串buf
:1,5,23,120
但我必须使用固定数量的占位符&#39;在sprintf()
。
我想提出一个函数,我可以传递数组的名称(例如timer[]
),这将构建一个字符串,可能使用for循环的&#39;变量长度&# 39; (取决于特定阵列到&#39;进程&#39;)和许多strcat()
函数。我已经尝试了几种方法来做到这一点,它们对编译器都没有意义,对我来说也没有意义!
我应该去哪看?
答案 0 :(得分:3)
这是你在普通C中可以做到的低技术方式。
char* toString(byte* bytes, int nbytes)
{
// Has to be static so it doesn't go out of scope at the end of the call.
// You could dynamically allocate memory based on nbytes.
// Size of 128 is arbitrary - pick something you know is big enough.
static char buffer[128];
char* bp = buffer;
*bp = 0; // means return will be valid even if nbytes is 0.
for(int i = 0; i < nbytes; i++)
{
if (i > 0) {
*bp = ','; bp++;
}
// sprintf can have errors, so probably want to check for a +ve
// result.
bp += sprintf(bp, "%d", bytes[i])
}
return buffer;
}
答案 1 :(得分:1)
一个实现,假设timer
是一个数组(否则,size必须作为参数传递)以及逗号的特殊处理。
基本上,在temp缓冲区中打印整数,然后连接到最终缓冲区。在需要的地方胡椒用逗号。
请注意,输出缓冲区的大小未经过测试。
#include <stdio.h>
#include <strings.h>
typedef unsigned char byte;
int main()
{
byte timer[4] = {1,5,23,120};
int i;
char buf[30] = "";
int first_item = 1;
for (i=0;i<sizeof(timer)/sizeof(timer[0]);i++)
{
char t[10];
if (!first_item)
{
strcat(buf,",");
}
first_item = 0;
sprintf(t,"%d",timer[i]);
strcat(buf,t);
}
printf(buf);
}