首页 > 代码库 > 从一个字符串中提取想要的数据

从一个字符串中提取想要的数据

 

  这个知识还热着呢,刚刚学来。...

 

  最近做了一个小东西,通过串口通信,把电脑上运行的labview和单片机连到了一起。
我的想法是这样的,我会在labview的图形界面设置好一系列参数,然后在把所有参数转成字符串然后按顺序连接起来,
  
例如:p1.2i33d4.445s7这样子。

电脑就把这样一个字符串扔给了单片机,然后我需要在单片机上进行数据提取。

先是定义好几个准备接收的字符串,P[10]、I[10]、D[10]、S[10],
我希望得到这样的结果:

P[10]=1.2
I[10]=33
D[10]=4.44
S[10]=7

弄了半天,都做不出来。

后来上了CSDN发帖 原帖地址http://bbs.csdn.net/topics/390947907?page=1#post-398634936

得到了超级满意的答案。

 

首先是sscanf()这个函数,之前完全没有接触过,现在突然发觉,C语言的标准库竟如此强大!

//=======================================================================

用法:

1. 常见用法。
  char buf[512] = ;
  sscanf("123456 ", "%s", buf);
  printf("%s\n", buf);
  结果为:123456
  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
  sscanf("123456 ", "%4s", buf);
  printf("%s\n", buf);
  结果为:1234
  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
  sscanf("123456 abcdedf", "%[^ ]", buf);
  printf("%s\n", buf);
  结果为:123456
  4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
  sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
  printf("%s\n", buf);
  结果为:123456abcdedf
  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
  sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
  printf("%s\n", buf);
  结果为:123456abcdedf
  6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非‘@‘的一串内容送到buf中
  sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
  printf("%s\n", buf);
  结果为:12DDWDFF
  7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
  sscanf(“hello, world”, "%*s%s", buf);
  printf("%s\n", buf);
  结果为:world
  %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
  如果没有空格则结果为NULL。

//=====================================================================

 

  再回到刚刚的问题,我是这样解决的

char str[];

char *p;

float kp,ki,kd,speedx;

 

p=str;

sscanf(p,"%fp%fi%fd%fs",&kp,&ki,&kd,&speedx);

 

最终得到了想要的结果,完美!

 

再次感叹,C语言真强大。

 

从一个字符串中提取想要的数据