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

 

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

 

  最近做了一个小东西,通过串口通信,把电脑上运行的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语言真强大。

 

转载于:https://www.cnblogs.com/shazi909/p/4147382.html

您好!要从一个字符串获取数据,您可以使用C#的各种方法和函数。以下是几种常见的方法: 1. 使用字符串的索引和子字符串方法。您可以使用字符串的索引来访问特定位置的字符,并使用Substring方法从字符串提取字符串。例如: ```csharp string str = "Hello, World!"; char firstChar = str[0]; // 获取第一个字符 'H' string subStr = str.Substring(7, 5); // 获取从索引7开始的5个字符,结果为 "World" ``` 2. 使用正则表达式。如果您需要从字符串提取特定模式的数据,可以使用正则表达式来匹配和提取数据。例如: ```csharp string str = "Name: John Doe, Age: 30"; Match nameMatch = Regex.Match(str, @"Name: (\w+)"); Match ageMatch = Regex.Match(str, @"Age: (\d+)"); string name = nameMatch.Groups[1].Value; // 获取名字 "John Doe" int age = int.Parse(ageMatch.Groups[1].Value); // 获取年龄 30 ``` 3. 使用字符串分割。如果您的字符串包含多个数据项,并且这些数据项之间使用特定的分隔符进行分隔,您可以使用Split方法将字符串拆分成多个子字符串。例如: ```csharp string str = "Apple,Orange,Banana"; string[] fruits = str.Split(','); // 使用逗号作为分隔符拆分字符串 // fruits 现在是一个包含三个元素的字符串数组:["Apple", "Orange", "Banana"] ``` 这里只是列举了一些常见的方法,具体取决于您的需求和数据的格式。希望对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值