之前一直以为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);对应输出如下: 注意: %*,忽略的字符数可以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中。
