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