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

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

  最近做了一个小东西,通过串口通信,把电脑上运行的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/[email protected],获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非‘@‘的一串内容送到buf中
  sscanf("iios/[email protected]", "%*[^/]/%[^@]", 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语言真强大。

时间: 2024-10-15 02:43:11

从一个字符串中提取想要的数据的相关文章

从一个字符串中提取一个子字符串

编写一个函数,它从一个字符串中提取一个子字符串.函数原型如下: int substr(char dst[], char src[],int start, int len) {} 目标是:从 src 数组起始位置向后偏移 start个字符的位置开始,最多复制 len 个非NUL 字符到 dst数组.在复制完毕之后, dst 数组必须以 NUL字节结尾.函数的返回值是存储于 dst 数组中的字符串的长度. #include<stdio.h> #include<stdlib.h> #de

OC-在一个字符串中查找另一个字符串的范围;从一个字符串中提取子串

/* 从字符串@"Welcome to Bejing!",中查找 Beijing的范围. */ #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString * str1 = @"Welcom to Beijing"; NSString * str2 = @"Beijing"; NSRang

编写一个函数,它从一个字符串中提取一个子字符串。

函数原型如下: int substr(char dst[], char src[], int start, int len){} 目标是: 从 src 数组起始位置向后偏移 start个字符的位置开始, 最多复制 len 个非NUL 字符到 dst数组.在复制完毕之后, dst 数组必须 以 NUL字节结尾.函数的返回值是存储于 dst 数组中的字符串的长度. #include<stdio.h> int main() { char dst[10]; char src[] = "Hel

C语言:编写一个函数,strcpy,dest,src,它从一个字符串中提取一个子字符串。

#include <stdio.h> #include <stdlib.h> #include <assert.h> //链式访问 char* my_strcpy(char *dest, const char *src) { char *ret = dest;  assert(src != NULL);  assert(dest != NULL);  while (*dest++ = *src++)  {   ;  }  return ret; } int main()

[编程题] 扫描透镜(本题还涉及如何从字符串中提取数字)

在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇? 输入描述: 第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小; 接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇.

算法积累(字符串转换驼峰,判断一个字符串中那个字母出现次数最多,并且出现了几次)

因为算法比较烂,所以想做一下这方面的积累. 尽量能够每天学习一个新算法吧.(不过估计很悬) 好吧,今天第一个是字符串转换驼峰 直接上代码 var str = 'toupper-case'; var arr = str.split('-'); //toupper,case for (var i = 1; i < arr.length; i++) { //把除了第一个数组后面的数组的第一个值设置为大写然后大写字母和去掉第一个字符的剩下的字符进行拼合 arr[i] = arr[i].charAt(0)

js获取一个字符串中指定字符串第n次出现的位置

1.JS获取一个字符串中指定字符串第n次出现的位置 了解类似的获取字符位置的方法: 1.1 charAt() 获取字符串指定位置的字符 用法:strObj是字符串对象,index是指定的位置,(位置从0开始数) strObj.charAt(index) 1.2 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 用法:stringObject是字符串对象,searchvalue是指定的字符串值,fromindex(可有可无)指定开始匹配字符串值的位置,若无,表示从0位置开始

从字符串中提取数字串并排序(C语言实现)

#include "stdio.h" #include "stdlib.h" #include "string.h" typedef int BOOL; #define TRUE 1; #define FALSE 0; static void SplitBySeparator( char **arr, char *str, int size, char sep); void SortNums ( char* str, int size, int

kohana如何从一个字符串中过滤掉特定的词语

Text::censor()斱法会字符串中过滤掉特定单词.要过滤的词作为一个数组参数传递.词语可以被整个或 者局部替换成你在配置中设置的字符串. 用法 创建一个你定义的敏感词配置文件 /home/kerkness/kohana/application/config/censor.php return array( 'words' => array( 'Codeigniter', 'Zend', 'CakePHP', 'Yii', ), ); 使用  censor()斱法从一个字符串中过滤掉这些词