C语言里sscanf函数的正则表达式

一、说明:
1、sscanf():从一个字符串中读进与指定格式相符的数据.
2、sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

二、控制sscanf函数变量接收值的控制字符
1、%[..],当字符属于方括号里表达式表示的字符集时继续读取,否则停止.方括号里的和正则表达式差不多,^是"排除..."的意思
2、%*[..],直接跳过方括号里的字符集并继续读取

三、举例
#include <iostream>
using namespace std;
int main()
{ char str[10];
for (int i = 0; i < 10; i++) 
str[i] = '!'; 

cout<<str<<endl;
sscanf("123456","%s",str); //---------str的值为 "123456\0!!!"
//这个实验很简单,把源字符串"123456"拷贝到str的前6个字符,并且把str的第7个字符设为null字符,也就是\0

cout<<str<<endl;
for (int i = 0; i < 10; i++) 
str[i] = '!'; 

sscanf("123456","%3s",str);  //---------str的值为 "123\0!!!!!!"
//看到没有,正则表达式的百分号后面多了一个3,这告诉sscanf只拷贝3个字符给str,然后把第4个字符设为null字符。

cout<<str<<endl;
for (int i = 0; i < 10; i++) 
str[i] = '!'; 

sscanf("aaaAAA","%[a-z]",str); // ---------str的值为 "aaa\0!!!!!!"
//从这个实验开始我们会使用正则表达式,括号里面的a-z就是一个正则表达式,它可以表示从a到z的任意字符,
//在继续讨论之前,我们先来看看百分号表示什么意思,%表示选择,%后面的是条件,比如实验1的"%s",s是一个条件,表示任意字符,"%s"的意思是:只要输入的东西是一个字符,就把它拷贝给str。实验2的"%3s"又多了一个条件:只拷贝3个字符。实验3的“%[a-z]”的条件稍微严格一些,输入的东西不但是字符,还得是一个小写字母的字符,所以实验3只拷贝了小写字母"aaa"给str,别忘了加上null字符。

cout<<str<<endl;
for (int i = 0; i < 10; i++) 
str[i] = '!'; 

sscanf("AAAaaaBBB","%[^a-z]",str); // ---------str的值为 "AAA\0!!!!!!"
//对于所有字符,只要不是小写字母,都满足"^a-z"正则表达式,符号^表示逻辑非。前3个字符都不是小写字符,所以将其拷贝给str,但最后3个字符也不是小写字母,为什么不拷贝给str呢?这是因为当碰到不满足条件的字符后,sscanf就会停止执行,不再扫描之后的字符。

cout<<str<<endl;
 
for (int i = 0; i < 10; i++) 
str[i] = '!'; 

sscanf("AAAaaaBBB","%*[A-Z]%[a-z]",str);  //---------str的值为 "aaa\0!!!!!!"
//这个实验出现了一个新的符号:%*,与%相反,%*表示过滤满足条件的字符,在这个实验中,%*[A-Z]过滤了所有大写字母,然后再使用%[a-z]把之后的小写字母拷贝给str。如果只有%*,没有%的话,sscanf不会拷贝任何字符到str,这时sscanf的作用仅仅是过滤字符串。

cout<<str<<endl;
for (int i = 0; i < 10; i++) 
str[i] = '!'; 

sscanf("AAAaaaBBB","%[a-z]",str); // ---------str的值为 "!!!!!!!!!!"
//做完前面几个实验后,我们都知道sscanf拷贝完成后,还会在str的后面加上一个null字符,但如果没有一个字符满足条件,sscanf不会在str 的后面加null字符,str的值依然是10个惊叹号。这个实验也说明了,如果不使用%*过滤掉前面不需要的字符,你永远别想取得中间的字符。

cout<<str<<endl;
for (int i = 0; i < 10; i++) str[i] = '!';
sscanf("AAAaaaBC=","%*[A-Z]%*[a-z]%[^a-z=]",str);  //---------str的值为 "BC\0!!!!!!!"
//这是一个综合实验,但这个实验的目的不是帮我们复习前面所学的知识,而是展示两个值得注意的地方:
//注意1:%只能使用一次,但%*可以使用多次,比如在这个实验里面,先用%*[A-Z]过滤大写字母,然后用%*[a-z]过滤小写字母。
// 注意2:^后面可以带多个条件,且这些条件都受^的作用,比如^a-z=表示^a-z且^=(既不是小写字母,也不是等于号)。

cout<<str<<endl;
for (int i = 0; i < 10; i++) 
str[i] = '!';
 
int k; 
sscanf("AAA123BBB456", "%*[A-Z]%i", &k);  //---------k的值为123
//首先,%*[^0-9]过滤前面非数字的字符,然后用%i把数字字符转换成int型的整数,拷贝到变量k,注意参数必须使用k的地址。 
cout<<str<<endl;
cout<<k<<endl;
return 0; 

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf是C语言中的一个函数,用于从字符串中按照指定的格式读取数据。它的原型如下: ```c int sscanf(const char *str, const char *format, ...); ``` `str`是要解析的字符串,`format`是解析的格式字符串,后面的参数是要读取的变量。 例如,假设有一个字符串`"name: John, age: 25"`,我们可以使用sscanf来解析出名字和年龄: ```c char name[20]; int age; sscanf("name: John, age: 25", "name: %s, age: %d", name, &age); ``` 在这个例子中,`%s`表示按照字符串的格式读取,`%d`表示按照整数的格式读取。`name`和`age`分别是要读取的变量。 正则表达式是一种强大的文本匹配工具,用于在字符串中查找特定模式的内容。在C语言中,可以使用正则表达式库来实现正则表达式的功能,例如POSIX标准库中的`regex.h`。 使用正则表达式需要先编译正则表达式模式,然后使用相应的函数进行匹配操作。以下是一个简单的示例: ```c #include <stdio.h> #include <regex.h> int main() { regex_t regex; int ret; char str[] = "Hello, World!"; char pattern[] = "Hello"; ret = regcomp(&regex, pattern, 0); if (ret) { printf("Failed to compile regex\n"); return ret; } ret = regexec(&regex, str, 0, NULL, 0); if (!ret) { printf("String matches pattern\n"); } else if (ret == REG_NOMATCH) { printf("String does not match pattern\n"); } else { printf("Failed to execute regex\n"); return ret; } regfree(&regex); return 0; } ``` 在这个例子中,我们使用`regcomp`函数编译正则表达式模式,然后使用`regexec`函数匹配字符串和模式。如果匹配成功,返回值为0;如果不匹配,返回值为`REG_NOMATCH`。 以上是关于sscanf正则表达式的简单介绍,希望能对你有帮助!如果有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值