hi55234 发表于 2014-4-8 22:15:25

求简单的方法:整数转为字符串,并写入数组的特定位置

本帖最后由 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:23

大致意思不是特别明白。 好似是要把 字符串里的一部分内容,更换掉? 是这样么?

hi55234 发表于 2014-4-9 09:07:15

shihaipeng04 发表于 2014-4-8 23:04 static/image/common/back.gif
大致意思不是特别明白。 好似是要把 字符串里的一部分内容,更换掉? 是这样么?

是的,就是这样~~~

Super169 发表于 2014-4-9 10:02:59

把數字分開 十位及個位, 再用 '0' + val (或 48 + val) 的方式更換可能是直接的了.
我自己做了一個 OLED 的庫, 當中也是用類似的方式去把數字轉換成文字,
String 感覺上耗資源比較多, 我自己非必要時也很少用.

转角 发表于 2014-4-9 10:33:54

本帖最后由 转角 于 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替换成你想要的任何数据

hi55234 发表于 2014-4-9 21:56:42

转角 发表于 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

hi55234 发表于 2014-4-10 09:18:48

转角 发表于 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]
查看完整版本: 求简单的方法:整数转为字符串,并写入数组的特定位置