取出某一段数据中的某部分数据
/***********************************************************
函数名称:Find_string(char *pcBuf,char*left,char*right, char *pcRes)
函数功能:寻找特定字符串
入口参数:
char *pcBuf 为传入的字符串
char*left 为搜索字符的左边标识符 例如:"["
char*right 为搜索字符的右边标识符 例如:"]"
char *pcRes 为输出转存的字符串数组
返回值:用来校验是否成功,无所谓的。
备注: left字符需要唯一,right字符从left后面开始唯一即可
服务器下发命令举例:+MQTTPUBLISH: 0,0,0,0,/device/NB/zx99999999999999_back,6,[reastrobot]
如要取出 IMEI:4569874236597\r\n 中的数字4569874236597
***********************************************************/
int Find_string(char *pcBuf,char *left,char *right, char *pcRes)
{
char *pcBegin = NULL;
char *pcEnd = NULL;
pcBegin = strstr(pcBuf, left);//取出左边数据
pcEnd = strstr(pcBegin+strlen(left), right);//扫描右边标识
if(pcBegin == NULL || pcEnd == NULL || pcBegin > pcEnd)
{
printf("string name not found!\n");
return 0;
}
else
{
pcBegin += strlen(left);
memcpy(pcRes, pcBegin, pcEnd-pcBegin);
return 1;
}
}
strstr使用方法
https://www.runoob.com/cprogramming/c-function-strstr.html
解释:
C 库函数char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
声明
下面是 strstr() 函数的声明。
char *strstr(const char *haystack, const char *needle)
参数
haystack -- 要被检索的 C 字符串。
needle -- 在 haystack 字符串内要搜索的小字符串。
返回值
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
实例
下面的实例演示了 strstr() 函数的用法。
实例
#include <stdio.h>
#include <string.h>
int main()
{
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret;
ret = strstr(haystack, needle);
printf("子字符串是: %s\n", ret);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
子字符串是: NOOB
memcpy()使用方法
https://www.runoob.com/cprogramming/c-function-memcpy.html
一、memset
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节(typedef unsigned int size_t)用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方。
memset()函数原型是
extern void *memset(void *buffer, int c, int count)
buffer:为指针或是数组,
c:是赋给buffer的值,
count:是buffer的长度.
memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);
memset的作用就是把str这个数组中的值初始化为0
二、sprintf
# include<stdio.h>
int sprintf(char *str, char *format ,...);
功能:
根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符'\0'为止。
参数:
参数列表
str:字符串首地址
format:这是字符串,包含了要被写入到字符串str的文本,可以包含嵌入的format标签
...:根据不同的format字符串,函数可能需要一系列的附加参数
返回值:
成功:实际格式化字符的个数
失败:-1
例子:
编译环境为VS2017,是在c环境下编译,同时为了不使sprintf函数出错,需要 右键单击工程名——>属性——>C/C++——>常规——>SDL检查(将SDL检查改为否)
#include<stdio.h>
#include<string.h>
#define a "hello"
#define b "world"
int main()
{
//1.格式化字符串
char buf[1024];
sprintf(buf, "hello %s", "world");
printf("buf:%s\n", buf);
printf("len:%d\n\n", strlen(buf));
//2.拼接字符串
char temp[1024];
char *s1 = "hello";
char *s2 = "world";
memset(temp, 0, 1024);
sprintf(temp, "%s %s", s1,s2);
printf("buf:%s\n", temp);
printf("len:%d\n\n", strlen(temp));
//2.1拼接字符串
char str[1024];
sprintf(str, "%s %s", a, b);
printf("buf:%s\n", str);
printf("len%d\n\n", strlen(str));
//3.数字转换成字符串打印出来
char num[1024];
int number = 666;
memset(num, 0, 1024);
sprintf(num, "%d", number);
printf("buf:%s\n", num);
printf("len:%d\n\n", strlen(num));
//4.设置宽度右对齐
char buffer[1024];
memset(buffer, 0, 1024);
sprintf(buffer, "%8d", number);
printf("buf:%s\n", buffer);
printf("len:%d\n\n", strlen(buffer));
//5.设置宽度左对齐
memset(buffer, 0, 1024);
sprintf(buffer, "%-8d", number);
printf("buf:%s\n", buffer);
printf("len:%d\n\n", strlen(buffer));
//6.转换成16进制字符串 小写
memset(buffer, 0, 1024);
sprintf(buffer, "0x%x", number);
printf("buf:%s\n", buffer);
printf("len:%d\n\n", strlen(buffer));
//6.转换成8进制字符串
memset(buffer, 0, 1024);
sprintf(buffer, "0%o", number);
printf("buf:%s\n", buffer);
printf("len:%d\n\n", strlen(buffer));
}