OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7765|回复: 12

关于字符串中的数据读取到数组中的问题

[复制链接]

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
发表于 2022-10-20 10:46:12 | 显示全部楼层 |阅读模式
1金钱
有一个字符串  "[1,2,3,...]" 内容是数组 长度不定但是有最大长度,
一个int[]型数组
如何把字符串里的  1,2, 3,4,读取到int[]数组中?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-10-20 10:57:58 | 显示全部楼层
看看这段代码能否看懂,能的话就写个循环调用它:
  1. // 计算字符串数字的值
  2. // *s为输入字符串,*v为返回数字的值,返回为数字字符串之后的指针
  3. U8* StrGetVal(U8 *s,U16 *v)
  4. {
  5.         U16 i,d;
  6.         i=200;
  7.         d=0;
  8.         while(i--)//跳过开头的非数字
  9.         {
  10.                 if((*s>='0')&&(*s<='9'))break;
  11.                 if(*s==0)break;
  12.                 s++;
  13.         }
  14.         i=200;
  15.         while(i--)
  16.         {
  17.                 if((*s>='0')&&(*s<='9'))//是数字则计算其值
  18.                 {
  19.                         d=d*10+(*s)-'0';
  20.                         s++;
  21.                 }
  22.                 else//非数字则退出
  23.                 {
  24.                         break;
  25.                 }
  26.         }
  27.         *v=d;
  28.         return s;
  29. }
复制代码
专治疑难杂症
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2022-10-20 11:02:32 | 显示全部楼层
LcwSwust 发表于 2022-10-20 10:57
看看这段代码能否看懂,能的话就写个循环调用它:

好的  感谢 感谢  我看看
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-10-20 11:04:29 | 显示全部楼层
LcwSwust 发表于 2022-10-20 10:57
看看这段代码能否看懂,能的话就写个循环调用它:

你好,第19行的d为什么要*10?
又菜又爱指点
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-10-20 11:17:48 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-10-20 11:19 编辑
驭剑的秘密 发表于 2022-10-20 11:04
你好,第19行的d为什么要*10?

规律就是这样,比如3位数123,循环第1次为 0*10+1=1,第2次为1*10+2=12,第3次为12*10+3=123,就是读到数字时,当前值*10加上这个数字就行。
也可想象成移位运算,后面有数字则当前值需要左移一位加上这个数字。
专治疑难杂症
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-10-20 11:17:50 | 显示全部楼层
驭剑的秘密 发表于 2022-10-20 11:04
你好,第19行的d为什么要*10?

哦,懂了,原来是把这一串连起来哦,"[1,2,3,...]"就是123...
又菜又爱指点
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-10-20 11:19:30 | 显示全部楼层
驭剑的秘密 发表于 2022-10-20 11:17
哦,懂了,原来是把这一串连起来哦,"[1,2,3,...]"就是123...

非也         
专治疑难杂症
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-10-20 11:19:42 | 显示全部楼层
LcwSwust 发表于 2022-10-20 11:17
规律就是这样,比如3位数123,循环第1次为 0*10+1=1,第2次为1*10+2=12,第3次为12*10+3=123,就是读 ...

在第20行后面break的话就是一个一个输出来咯?
又菜又爱指点
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-10-20 11:22:31 | 显示全部楼层
驭剑的秘密 发表于 2022-10-20 11:19
在第20行后面break的话就是一个一个输出来咯?

比如有一个字符串为"abc123def456ghi",调用一次这个函数可以得到v=123;移动指针后再调用一次可得到456。
专治疑难杂症
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-10-20 11:28:09 | 显示全部楼层
LcwSwust 发表于 2022-10-20 11:22
比如有一个字符串为"abc123def456ghi",调用一次这个函数可以得到v=123;移动指针后再调用一次可得到456。

我想的是如果不连起来输出,第20行后面加个break应该可以吧,比如abcd1234,调用一次就得到1,再来一次得到2
又菜又爱指点
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-10-20 11:29:12 | 显示全部楼层
驭剑的秘密 发表于 2022-10-20 11:28
我想的是如果不连起来输出,第20行后面加个break应该可以吧,比如abcd1234,调用一次就得到1,再来一次得 ...

不过这样的话每次调用还要改*s,变得麻烦了哈?
又菜又爱指点
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1042
金钱
1042
注册时间
2022-4-20
在线时间
373 小时
发表于 2022-10-20 11:36:50 | 显示全部楼层
LcwSwust 发表于 2022-10-20 11:22
比如有一个字符串为"abc123def456ghi",调用一次这个函数可以得到v=123;移动指针后再调用一次可得到456。

大佬,我又来了,这样应该就可以分别装到数组里边了吧,
  1. u8* StrGetVal(u8 *s,int *v)
  2. {
  3.         u16 i;
  4.         i=200;
  5.         while(i--)//跳过开头的非数字
  6.         {
  7.                 if((*s>='0')&&(*s<='9'))break;
  8.                 if(*s==0)break;
  9.                 s++;
  10.         }
  11.         i=200;
  12.         while(i--)
  13.         {
  14.                 if((*s>='0')&&(*s<='9'))//是数字则计算其值
  15.                 {
  16.                         *v=(*s)-'0';
  17.                         s++;
  18.                         v++;
  19.                 }
  20.                 else//非数字则退出
  21.                 {
  22.                         break;
  23.                 }
  24.         }
  25.         return s;
  26. }
复制代码


又菜又爱指点
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-10-20 11:46:16 | 显示全部楼层
驭剑的秘密 发表于 2022-10-20 11:36
大佬,我又来了,这样应该就可以分别装到数组里边了吧,

只是多了个V++?这不行啊,遇到第一个逗号就退出了。
你再多研究研究,万一有两位数怎么办。
或者弄懂原理后以自己的思路重新写一个函数。
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 00:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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