之前一直以为C++引入正则表达式之前,不能实现类似功能,最近发现sscanf就可以实现一些简单的字符串解析功能,记录下。

int scanf( const char *format [,argument]… );

  char buf[100];
//1、常用用法
sscanf("123456abcdeABCDE", "%s", buf);
printf("1 、buf = %s\n", buf);
//2、限制读取字符长度
sscanf("123456abcdeABCDE", "%5s", buf);
printf("2、buf = %s\n", buf);
//3、按格式提取
sscanf("str = 123456abcdeABCDE", "str = %s", buf);
printf("3、buf = %s\n", buf);
//4、尽可能匹配[]中的条件,类似于正则表达式中的贪婪模式
//条件如:[a-z],[0-9],[a-z123]等等
sscanf("abababababbababababababab", "%[ab]", buf);
printf("4、buf = %s\n", buf);
//5、匹配到某字符,或者条件
sscanf("str = 123456abcdeABCDE", "str = %[^A]", buf);
printf("5、buf = %s\n", buf);
//6、%*忽略符合条件的字符
sscanf("123456abcdeABCDE", "%*[1-5]%s", buf);
printf("6、buf = %s\n", buf);
//7、截取某特定符号之间的内容
sscanf("123456@abcde@ABCDE", "%*[^@]@%[^@]", buf);
printf("7、buf = %s\n", buf);

对应输出如下:

sscanf 解析字符串_正则表达式

注意:

%*,忽略的字符数可以0~n个字符;

%*[表达式],至少要有一个字符符合表达式要求,否则匹配失败,返回0;借助这个特性,我们可以用来判断字符串的开头,

bool StartWithNum(const char* str)
{
char buf[100];
return sscanf(str,"%*[0-9]%s",buf) ? true:false;
}

返回值

函数将返回成功赋值的字段个数;返回值不包括已读取但未赋值的字段个数。 返回值为 0 表示没有将任何字段赋值。 如果在第一次读取之前到达字符串结尾,则返回EOF。

如果buffer或format是NULL调用指针,无效参数处理程序,如中所述参数验证。 如果允许继续执行,则这些函数返回 -1 并将errno设置为EINVAL。

成功则返回参数数目,失败则返回-1,错误原因存于errno中。