截取字符串
#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;
}