求简单的方法:整数转为字符串,并写入数组的特定位置
本帖最后由 hi55234 于 2014-4-10 23:12 编辑举个例子,如:
数组A=2014/04/08 :LF(换行)、CR(回车) 21:59:19、其他数据若干XXX
时间过去一秒后,DS1037返回“秒”的值为20(int)
显然,如果需要输出正确的时间,数组A的代表“秒"的数据就需要由19变成20(实际上是(String)1变成(String)2,(String)9变成(String)0,是字符的变化)
问题就来了,怎么最简易的实现这种装换(因为后面的”其他若干数据“并不是每秒都刷新的,所以实质上是对特定位置的数据进行改写)~~~
方法1:繁琐
拆分int为个位数————int + 48 变成相应的ASCII码~~~虽然没问题,但怎么看怎么不爽
方案2,还没试
管他三七二十一,先把int全部变字符串(myString += value),量一下字符串的长度,拆分后与数组A的特定部分对号入座 大致意思不是特别明白。 好似是要把 字符串里的一部分内容,更换掉? 是这样么? shihaipeng04 发表于 2014-4-8 23:04 static/image/common/back.gif
大致意思不是特别明白。 好似是要把 字符串里的一部分内容,更换掉? 是这样么?
是的,就是这样~~~ 把數字分開 十位及個位, 再用 '0' + val (或 48 + val) 的方式更換可能是直接的了.
我自己做了一個 OLED 的庫, 當中也是用類似的方式去把數字轉換成文字,
String 感覺上耗資源比較多, 我自己非必要時也很少用. 本帖最后由 转角 于 2014-4-9 10:51 编辑
2014/04/08 :LF(换行)、CR(回车) 21:59:19 前面这半部分长度是固定的吧?如果不是固定的就需要解析,找到时间21:59:19的位置。 是固定的就方便多了。
用strncpy函数把21:59:19复制到char数组中 原型: char*strncpy(char*dest,char*src,size_tnum);
strncpy(dest,A+15,8) 这里dest里面存储的就是21:59:19了。为什么是a+15不知道你能理解了不,就是21:59:19相对于数组起始位置的偏移量,8就是21:59:19的长度。记得dest定义长度至少要9个字符。
然后使用atoi itoa 这俩函数对字符串和int互相转化,剩下的你就会了。 之前想让你用time_t,结果发现arduino没有time_t 就又删了。
还有个memset函数也可以直接把21:59:19替换成你想要的任何数据 转角 发表于 2014-4-9 10:33 static/image/common/back.gif
2014/04/08 :LF(换行)、CR(回车) 21:59:19 前面这半部分长度是固定的吧?如果不是固定的就需要解析 ...
memset函数是个很有意思的函数,值得尝试:
C函数之memcpy()函数用法
[日期:2011-10-03] 来源:Linux社区作者:tigerjb [字体:大 中 小]
函数原型
void *memcpy(void*dest, const void *src, size_t n);
功能
由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
头文件
#include<string.h>
返回值
函数返回一个指向dest的指针。
说明
1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。
2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
例:
char a, b;
memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:
char a, b;
strcpy(a,b);
3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
//注意,source和destin都不一定是数组,任意的可读写的空间均可。
程序例
example1
作用:将s中的字符串复制到字符数组d中。
//memcpy.c
#include<stdio.h>
#include<string.h>
intmain()
{
char*s="Golden Global View";
chard;
clrscr();
memcpy(d,s,strlen(s));
d='\0';//因为从d开始复制,总长度为strlen(s),d置为结束符
printf("%s",d);
getchar();
return0;
}
输出结果:GoldenGlobal View
example2
作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)
#include<string.h>
intmain()
{
char*s="Golden Global View";
chard;
memcpy(d,s+14,4);//从第14个字符(V)开始复制,连续复制4个字符(View)
//memcpy(d,s+14*sizeof(char),4*sizeof(char));也可
d='\0';
printf("%s",d);
getchar();
return0;
}
输出结果: View
example3
作用:复制后覆盖原有部分数据
#include<stdio.h>
#include<string.h>
intmain(void)
{
charsrc[] = "******************************";
chardest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
printf("destinationbefore memcpy: %s\n", dest);
memcpy(dest,src, strlen(src));
printf("destinationafter memcpy: %s\n", dest);
return0;
}
输出结果:
destinationbefore memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
destinationafter memcpy: ******************************as6
转角 发表于 2014-4-9 10:33 static/image/common/back.gif
2014/04/08 :LF(换行)、CR(回车) 21:59:19 前面这半部分长度是固定的吧?如果不是固定的就需要解析 ...
数组对数组的时候,memcpy的写法比较简单
char src[] = "123456789*********************";
char dest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
int x=0;
void setup() {
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
if(x<10)x++;
else x=1;
memcpy(dest+x,src, 1+x);
Serial.println(dest);
delay(3000); // delay in between reads for stability
}
页:
[1]