极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11662|回复: 6

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

[复制链接]
发表于 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的特定部分对号入座
回复

使用道具 举报

发表于 2014-4-8 23:04:23 | 显示全部楼层
大致意思不是特别明白。 好似是要把 字符串里的一部分内容,更换掉? 是这样么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-9 09:07:15 | 显示全部楼层
shihaipeng04 发表于 2014-4-8 23:04
大致意思不是特别明白。 好似是要把 字符串里的一部分内容,更换掉? 是这样么?

是的,就是这样~~~
回复 支持 反对

使用道具 举报

发表于 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替换成你想要的任何数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-9 21:56:42 | 显示全部楼层
转角 发表于 2014-4-9 10:33
2014/04/08 :LF(换行)、CR(回车) 21:59:19    前面这半部分长度是固定的吧?如果不是固定的就需要解析 ...

memset函数是个很有意思的函数,值得尝试:


  1. C函数之memcpy()函数用法

  2. [日期:2011-10-03]        来源:Linux社区  作者:tigerjb        [字体:大 中 小]
  3. 函数原型

  4. void *memcpy(void*dest, const void *src, size_t n);

  5. 功能

  6. 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

  7. 头文件

  8. #include<string.h>

  9. 返回值

  10.   函数返回一个指向dest的指针。

  11. 说明

  12.   1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。

  13.   2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。


  14. memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;

  15. 例:

  16.   char a[100], b[50];

  17.   memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。

  18.   strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:

  19.   char a[100], b[50];

  20. strcpy(a,b);

  21.   3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

  22.   //注意,source和destin都不一定是数组,任意的可读写的空间均可。

  23. 程序例

  24. example1

  25.   作用:将s中的字符串复制到字符数组d中。

  26.   //memcpy.c

  27.   #include<stdio.h>

  28.   #include<string.h>

  29.   intmain()

  30.   {

  31.   char*s="Golden Global View";

  32.   chard[20];

  33.   clrscr();

  34.   memcpy(d,s,strlen(s));

  35.   d[strlen(s)]='\0';//因为从d[0]开始复制,总长度为strlen(s),d[strlen(s)]置为结束符

  36.   printf("%s",d);

  37.   getchar();

  38.   return0;

  39.   }

  40.   输出结果:GoldenGlobal View

  41. example2

  42.   作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)

  43.   #include<string.h>

  44.   intmain()

  45.   {

  46.   char*s="Golden Global View";

  47.   chard[20];

  48.   memcpy(d,s+14,4);//从第14个字符(V)开始复制,连续复制4个字符(View)

  49.   //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可

  50.   d[4]='\0';

  51.   printf("%s",d);

  52.   getchar();

  53.   return0;

  54.   }

  55.   输出结果: View

  56. example3

  57.   作用:复制后覆盖原有部分数据

  58.   #include<stdio.h>

  59.   #include<string.h>

  60.   intmain(void)

  61.   {

  62.   charsrc[] = "******************************";

  63.   chardest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";

  64.   printf("destinationbefore memcpy: %s\n", dest);

  65.   memcpy(dest,src, strlen(src));

  66.   printf("destinationafter memcpy: %s\n", dest);

  67.   return0;

  68.   }

  69.   输出结果:

  70.   destinationbefore memcpy:abcdefghijlkmnopqrstuvwxyz0123as6

  71.   destinationafter memcpy: ******************************as6

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-10 09:18:48 | 显示全部楼层
转角 发表于 2014-4-9 10:33
2014/04/08 :LF(换行)、CR(回车) 21:59:19    前面这半部分长度是固定的吧?如果不是固定的就需要解析 ...

数组对数组的时候,memcpy的写法比较简单

  1. char src[] = "123456789*********************";

  2. char dest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";

  3. int x=0;
  4. void setup() {

  5.   Serial.begin(9600);
  6. }

  7. // the loop routine runs over and over again forever:
  8. void loop() {
  9. if(x<10)x++;
  10. else x=1;

  11.   memcpy(dest+x,src, 1+x);
  12.   Serial.println(dest);
  13.   delay(3000);        // delay in between reads for stability
  14. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-22 23:01 , Processed in 0.043622 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表