获取字符串中某一个字段的数据,GetValueFromStr;拓展字符串解析parse_string

gps数据格式为:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*

/**********************************************************************
*版权所有 (C)2015, Wuyq。
*
*文件名称: GetValueFromStr.c
*内容摘要:用于演示从gps数据字符串中获取相应的内容
*其它说明:无
*当前版本: V1.0
*作    者: wuyq
*完成日期: 20150210
*
*  版本       修改时间     修改人           修改内容
********************************************************************
*   V1.0      20150210      wuyq             创建
**********************************************************************/
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//字段最大长度
#define MAX_RET_BUF_LEN     (1024)

//数据类型
typedef unsigned char       UINT8;
typedef unsigned short int  UINT16;
typedef unsigned int        UINT32;
typedef signed   int        INT32;
typedef unsigned char       BOOL;

#define  TRUE         (BOOL)1
#define  FALSE        (BOOL)0

/**********************************************************************
*功能描述:获取字符串中某一个字段的数据
*输入参数: iSerialNum-字段编号(为正整数)
pSourceStr-源字符串
pDstStr-目的字符串(提取的数据的存放位置)
cIsolater-源字符串中字段的分隔符
iDstStrSize-目的字符串的长度
*输出参数:无
*返回值: TRUE-成功  FALSE-失败
*其它说明:无
*修改日期        版本号            修改人         修改内容
* --------------------------------------------------------------
* 20150210        V1.0              wuyq           创建
***********************************************************************/
BOOL GetValueFromStr(UINT16 iSerialNum, UINT8 *pSourceStr, UINT8 *pDstStr, UINT8 cIsolater, UINT32 iDstStrSize)
{
	UINT8  *pStrBegin = NULL;
	UINT8  *pStrEnd = NULL;
	UINT8   szRetBuf[MAX_RET_BUF_LEN] = { 0 }; //截取出的字符串放入该数组中
	UINT8  *pUINT8 = NULL;
	UINT16 *pUINT16 = NULL;
	UINT32 *pUINT32 = NULL;
	UINT32  iFieldLen = 0;     //用于表示每个字段的实际长度

	if (pSourceStr == NULL)           //对输入指针的异常情况进行判断
	{
		return FALSE;
	}
	//字段首
	pStrBegin = pSourceStr;

	while (--iSerialNum != 0)
	{
		printf("wo zhixing le\n");
		pStrBegin = strchr(pStrBegin, cIsolater);
		if (pStrBegin == NULL)
		{
			return FALSE;
		}
		pStrBegin++;
	}

	//字段尾
	pStrEnd = strchr(pStrBegin, cIsolater);
	if (pStrEnd == NULL)
	{
		return FALSE;
	}

	iFieldLen = (UINT16)(pStrEnd - pStrBegin);
	if (iFieldLen >= MAX_RET_BUF_LEN) //进行异常保护, 防止每个字段的值过长
	{
		iFieldLen = MAX_RET_BUF_LEN - 1;
	}

	memcpy(szRetBuf, pStrBegin, iFieldLen);
	strncpy(pDstStr, szRetBuf, iDstStrSize);

	return TRUE;
}

/****************************************************************
*功能描述:  主函数                                             *
*输入参数:  无                                                 *
*输出参数:  无                                                 *
*返回值  :无                                                 *
*其他说明:  无                                                 *
*修改日期        版本号       修改人        修改内容
* -------------------------------------------------------------------------------
* 20150210        V1.0         wuyq           创建
****************************************************************/
void main()
{
	FILE  *hFile = NULL;   //文件句柄指针
	UINT8 szContentLine[1024] = { 0 };       //用于存放从文件中独到的每条记录
	UINT8 szDes[100] = { 0 };//接收分离出的数据
	//打开文件
	hFile = fopen("gpsdata.txt", "r");
	if (!hFile)                     //打开失败
	{
		printf("Open gpsdata.txt failed!\n");
		return -1;                  //异常退出
	}
	while (NULL != fgets(szContentLine, sizeof(szContentLine), hFile))//不断地读取文件
	{
		printf("szContentLine=[%s]\n", szContentLine);//打印没次读到一行的数据内容

		if (TRUE != GetValueFromStr(1, szContentLine, szDes, ',', sizeof(szDes)))
		{
			printf("获取信息1失败.\n");
			return -1;
		}
		printf("szDes=[%s]\n", szDes);
		if (TRUE != GetValueFromStr(2, szContentLine, szDes, ',', sizeof(szDes)))
		{
			printf("获取信息2失败.\n");
			return -1;
		}
		printf("szDes=[%s]\n", szDes);
		// ...
	}
	fclose(hFile);
	system("pause");
}

字符串解析parse_string获取系统内存,cpu使用情况等。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* 字符串解析*/
/*打开的文件,文件中要查找的字符串,返回数据的地址首地址*/
char *parse_string(char *file, char *string)
{
	int fd;
	char pbuf[1024 * 10];
	int nread;
	char *ptmp;
	char *end;
	static char start[100];

	if (!file || !string)
	{
		return NULL;
	}
	/* 打开文件*/
	fd = open(file, O_RDONLY);
	if (fd < 0)
	{
		printf("open %s file error!\n", file);
		return NULL;
	}
	/*将文件读入缓冲区中*/
	nread = read(fd, pbuf, sizeof(pbuf));//将文件中的内容,存放到pbuf中
	if (nread < 0)
	{
		printf("read %s file error!", file);
		return NULL;
	}
	/* 查找文件中的字符串*/
	ptmp = strstr(pbuf, string);
	ptmp += strlen(string);//跳过查找到的字符串位置
	while ((*ptmp == ' ') || (*ptmp == ':') || (*ptmp == '\t'))
	{
		ptmp++;
	}
	//start[0] = *ptmp;//debug
	//printf("start:[%c]\n", *start);
	end = strchr(ptmp, ' ');//查找到所需的数据
	*end = '\0';
	memcpy(start, ptmp, end-ptmp);//拷贝数据,进行返回
	return start;
}

int main()
{
	printf("MemFree:[%s]\n", parse_string("/proc/meminfo", "MemFree"));
	return 0;
}
时间: 2024-09-17 04:02:53

获取字符串中某一个字段的数据,GetValueFromStr;拓展字符串解析parse_string的相关文章

mfc 如何获取字符串中的16进制数据

问题描述 mfc 如何获取字符串中的16进制数据 mfc 如何获取字符串中的16进制数据,如字符串"0x123F"或"123F",获取16进制数据0x123F 解决方案 C++实现二进制.八进制.十进制.十六进制的相互转换 解决方案二: 这种算法只能针对特殊的格式字符串吧,不能做到万能的算法. 你这种需求你肯定知道字符串的大致格式,那么你就只有根据你的需求来匹配16进制的. 比如你可以搜索0x开头的,然后在后面继续匹配. 解决方案三: 先读取字符串,然后根据你的格式

数据-SQL中将多行中的一个字段列中的数值加/号组合在一起

问题描述 SQL中将多行中的一个字段列中的数值加/号组合在一起 一张表中有以下字段,想做如下处理,将统一DJLSH下相同的GNLX的XMBH与XMMC合并成一条数据. 1401090002的DJLSH中,XMBH803膀胱的GNLX是B超,802也是B超,那么就要进行合并. 实现的效果如下: 求组各位大神! 解决方案 oracle的wmsys.wm_concat,oralce11g开始特有的listagg mysql的group_concat函数 sqlserver的xml path 都是处理你

mongotemplate-mongoTemplate 查询结果,按子文档中的一个字段排序,要怎么实现?

问题描述 mongoTemplate 查询结果,按子文档中的一个字段排序,要怎么实现? 要查询的mongo数据: {_id"" : ***_class"" : ""***""downloadCount"" : {china"" : 20google"" : 10 }}{_id"" : ***_class"" : "&q

sql查询:如何用A组数据去查询另外一张表里的一个字段的数据并按A组数据的顺序排序

问题描述 sql查询:如何用A组数据去查询另外一张表里的一个字段的数据并按A组数据的顺序排序 我有这样的一组数据定为A:这个数据和我另一张表user_cards 中 grant_pid的数据是相等了,我想通过这组数据去查partner_id的数据并且按照A数据的这个顺序. 解决方案 select A.idB.id from A inner join B on A.id=B.id order by A.id 解决方案二: sql_查询一张表中的重复数据sql查询一张表的重复数据

asp.net 中 如何将数据库中某一个字段的值显示在8行8列的表格中,点击某个表格的值时还能编辑

问题描述 asp.net 中 如何将数据库中某一个字段的值显示在8行8列的表格中,点击某个表格的值时还能编辑 asp.net 中 如何将数据库中某一个字段的值显示在8行8列的表格中,点击某个表格的值时还能编辑 解决方案 你是要某个字段显示在8行8列的表格中还是说读取数据出来之后是个8行8列的表格,然后显示进去? 可以直接用GRIDVIEW,或者直接用html拼接,至于修改,gridview有自带的commond方法 解决方案二: 数据库有64条记录,把64个记录中的score字段的值全部显示在表

第三方系统,在某表中追加一个字段会影响系统运行吗?

问题描述 第三方系统,在某表中追加一个字段(非PK FK)会影响系统运行吗?如果有 请举例 ! 解决方案 会出问题,insert语句不指定列名,如:insert into table_name values(xxx, xxx, xxx);你现在表加了一个字段,不就出错了.解决方案二:再加个表,做个触发器同步关系数据更安全.解决方案三:不过说来也奇怪第三方的系统,怎么允许让你们修改他们的数据库结构呢?解决方案四:如果字段可以为空,就应该没有问题.但是呢,就像楼上说的,insert方法可能会有影响.

java的action里字符串中含有一个“=”,传到前台后,变为“\u003d”

问题描述 java的action里字符串中含有一个"=",传到前台后,变为"u003d",为什么会变成这样的字符呢? 问题补充:7454103 写道 解决方案 前台?<html> <head> <title>My JSP 'test.jsp' starting page</title> <script language="javascript"> var str="u003d&

从字符串中取一个字符作为数组元素

从字符串中取一个字符作为数组元素 public class mainclass {   public static void main(string[] arg) {     string text = "to be or not to be";        // define a string     byte[] textarray = text.getbytes();         for(byte b: textarray){       system.out.printl

hibernate-Oracle数据库中新增一个字段,Hibernate中映射怎样加?

问题描述 Oracle数据库中新增一个字段,Hibernate中映射怎样加? 问题:我在oracle数据库中新增一个字段,那么在Hibernate映射中,需要手动加进去吗?在中. 谢谢!! 解决方案 类似这样,第一个name对应实体中,第二个name对应数据库 解决方案二: