C语言sscanf()正则表达式注意及截取字符串 提取数字 转16进制字节数组 超简单

截取字符串

 

#include <stdio.h>
int main(int argc,char** argv)
{
	const char* in = "a1b2c3ABCdef 123";
	char out[100] = {0};

	sscanf(in,"%3s", out);
	printf("截取前3个字符:%s\n",out);

	memset(out,0,sizeof(out));
	sscanf(in,"%*3s%3s", out);
	printf("跳过3个字符后截取前3个字符:%s\n",out); 

	memset(out,0,sizeof(out));
	sscanf(in,"%*[^A]A%3s", out);
	printf("忽略开头到A字符串,截取前3个字符:%s\n",out);
	
	memset(out,0,sizeof(out));
	sscanf(in,"a%[0-9]b", out); //不是%d哦
	printf("提取数字:%s\n",out);

	memset(out,0,sizeof(out));
	sscanf(in,"a1b2c3%[a-zA-Z]", out); 
	printf("提取小写+大写字母:%s\n",out);
	return 0;
}

%表示选择,%后面的是条件。

  比如"%s",s是一个条件,表示任意字符,"%s"的意思是:只要输入的东西是一个字符,就把它拷贝给str。

  比如"%3s"又多了一个条件:只拷贝3个字符。

  比如“%[a-z]”的条件稍微严格一些,输入的东西不但是字符,还得是一个小写字母的字符。

  []内是匹配的字符,^表示求反集,当遇到非集合内的字符时终止。贪婪算法,即算法可能多的匹配字符。

  注意:遇到非匹配项就结束。不处理非匹配项后面的内容。

%* 与%刚好相反,表示过滤满足条件的字符,也就是跳过满足条件的字符,其后一定要有新的%语句,否则无法读入。

注意:遇到非匹配项就结束。不处理非匹配项后面的内容。


 

scanf()正则表达式的使用 - 橙&子 - 博客园 这文章完全错误。

示例

sscanf把16进制src字符串转为16进制数组dest 比如:“1234” 转为 {0x12,0x34}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//把16进制src字符串转为16进制数组dest 比如:“1234” {0x12,0x34} 返回长度
unsigned int HexStringtoByte(char *dest, char *src)
{
	unsigned int i = 0;
	int j=0;
    unsigned int length=strlen(src)/2;
	for (; i < length; i++)
	{
		sscanf(src + 2 * i, "%02X", &j); //j是4个字节,j来临时中转
		*(dest+i)=(char)j;
	}
    return length;
}
int main()
{
	unsigned int i;
	char src[]="123400";
 
	unsigned int length=HexStringtoByte(src,src);//转换后放在原数组里,可能存在0x00,转换后长度不能用strlen来求了。
	for(i=0;i<length;i++)
	{
		printf("%02X\n",src[i]); //12 34 00
	}
	return 0;
}

提取数字

#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** argv)
{
	const char* in = "Qualcomm HS-USB Diagnostics 9091 (COM20)";
	char out[100] = {0};

	sscanf(in,"Qualcomm HS-USB Diagnostics 9091 (COM%[0-9])", out); //不是%d哦
	printf("提取数字:%s\n",out);
	return 0;
}

  

#include <stdio.h>
#include <stdlib.h>
int getComNum(char *in)
{
	char out[100] = {0};
	sscanf(in,"Qualcomm HS-USB Diagnostics 9091 (COM%[0-9])", out); //不是%d哦
	return atoi(out);
}
int main(int argc,char** argv)
{
	printf("串口号:%d\n",getComNum("Qualcomm HS-USB Diagnostics 9091 (COM20)"));
	return 0;
}

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值