导航:首页 > 净水问答 > sscanf如何过滤

sscanf如何过滤

发布时间:2023-01-30 09:19:45

① c++ 如何知道sscanf读取了多少个字符

char str[10];

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

执行完后str的值为

str = "!!!!!!!!!!"

我们把str的每个字符都初始化为惊叹号,当str的值发生变化时,使用printf打印str的值,对比先前的惊叹号,这样就可以方便的观察str发生了怎样的变化。下面我们做几个小实验,看看使用sscanf和正则表达式格式化输入后,str有什么变化。

实验1:

sscanf("123456","%s",str); ---------str的值为 "123456\0!!!"

这个实验很简单,把源字符串"123456"拷贝到str的前6个字符,并且把str的第7个字符设为null字符,也就是\0

实验2:

sscanf("123456","%3s",str); ---------str的值为 "123\0!!!!!!"

看到没有,正则表达式的百分号后面多了一个3,这告诉sscanf只拷贝3个字符给str,然后把第4个字符设为null字符。

实验3:

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字符。

实验4:

sscanf("AAAaaaBBB","%[^a-z]",str); ---------str的值为 "AAA\0!!!!!!"

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

实验5:

sscanf("AAAaaaBBB","%[A-Z]%[a-z]",str); ---------段错误

这个实验的本意是:先把大写字母拷贝给str,然后把小写字母拷贝给str,但很不幸,程序运行的时候会发生段错误,因为当sscanf扫描到字符a时,违反了条件"%[A-Z]",sscanf就停止执行,不再扫描之后的字符,所以第二个条件也就没有任何意义,这个实验说明:不能使用%号两次或两次以上

实验6:

sscanf("AAAaaaBBB","%*[A-Z]%[a-z]",str); ---------str的值为 "aaa\0!!!!!!"

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

实验7:

sscanf("AAAaaaBBB","%[a-z]",str); ---------str的值为 "!!!!!!!!!!"

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

实验8:

sscanf("AAAaaaBC=","%*[A-Z]%*[a-z]%[^a-z=]",str); ---------str的值为 "BC\0!!!!!!!"

这是一个综合实验,但这个实验的目的不是帮我们复习前面所学的知识,而是展示两个值得注意的地方:

注意1:%只能使用一次,但%*可以使用多次,比如在这个实验里面,先用%*[A-Z]过滤大写字母,然后用%*[a-z]过滤小写字母。

注意2:^后面可以带多个条件,且这些条件都受^的作用,比如^a-z=表示^a-z且^=(既不是小写字母,也不是等于号)。

实验9:

int k;

sscanf("AAA123BBB456", "%*[^0-9]%i", &k); ---------k的值为123

首先,%*[^0-9]过滤前面非数字的字符,然后用%i把数字字符转换成int型的整数,拷贝到变量k,注意参数必须使用k的地址。

[cpp] view plain
#if 0
1,sscanf():从一个字符串中读进与指定格式相符的数据.
2,sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
3,关于正则表达式:
(1)%[..],当字符属于方括号里表达式表示的字符集时继续读取,否则停止.方括号里的和正则表达式差不多,^是"排除..."的意思
(2)%*[..],直接跳过方括号里的字符集并继续读取
#endif

#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,然后把小写字母拷贝给str,但很不幸,程序运行的时候会发生段错误,因为当sscanf扫描到字符a时,违反了条件"%[A-Z]",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;
}

② c语言中关于sscanf函数的运用及%n的用法

代码如下:

#include<stdio.h>

#include<string.h>

int main (){

char s[200];

int n,wei;

memset(s,0,sizeof(s));

while(gets(s)){

int cnt=0,sum=0,num;

char *p=s;

while(sscanf(p,"%d%n",&n,&wei)==1){

sum+=n;cnt++;wei++;

if(p) p+=wei;

}

printf("%d %d ",cnt,sum);

memset(s,0,sizeof(s));

}

return 0;

}

(2)sscanf如何过滤扩展阅读

scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。

scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

其控制串由三类字符构成:

1、格式化说明符;

2、空白符;

3、非空白符;

用空白符结尾时,scanf会跳过空白符去读下一个字符,所以必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果用scanf("%d ",&a)也会出现同样的问题。

③ VC++ sscanf 问题

int i = 0, j = 0;
int count = 5;
char buffer1[6] = "12345";
char buffer2[5];
for(count; count > 0; count--)
{
if(buffer1[i] != '3')
{
sscanf(&buffer1[i], "%c", &buffer2[j]);
i++;
j++;
}
else
i++;
}
buffer2[j] = '\0';

④ 一个sscanf的问题

%*[^/]/ 相当于两步:
1. %*[^/] 不录入不为/的字符 剩下: /12DDWDFF@122
2. %*/ 不录入/字符 剩下: 12DDWDFF@122
%[^@]
录入不为@的字符 取值: 12DDWDFF

⑤ 如何从文本文件中读取字符串又滤掉空格

简单
C#的
string str="abc def ght";
List<string> strList=new List<string>();//泛型
string[] strs=str.split(' ');
for(int i=0;i<strs.length;i++)
{
if(strs[i]!="")//过滤且分割
{
strList.add(strs[i]);
}
}

//strList就是你想要的了

⑥ sscanf函数

sscanf() - 从一个字符串中读进与指定格式相符的数据.
函数原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
说明:
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
注:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
支持集合操作:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性

例子:
1. 常见用法。
char buf[512] = ;
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.
//-------------------------------------------------------
sscanf,表示从字符串中格式化输入
上面表示从str中,输入数字给x,就是32700
久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。
sscanf是一个运行时函数,原形很简单:
int sscanf(
const char *buffer,
const char *format [,
argument ] ...
);
它强大的功能体现在对format的支持上。
我以前用它来分隔类似这样的字符串2006:03:18:
int a, b, c;
sscanf("2006:03:18", "%d:%d:%d", a, b, c);
以及2006:03:18 - 2006:04:18:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
但是后来,我需要处理2006:03:18-2006:04:18
仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。
我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。
format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
%[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。
所以那个问题也就迎刃而解了:
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

⑦ c++中sscanf函数与sprintf函数的用法

一.sscanf 读取格式化的字符串中的数据
sscanf和scanf类似,都是用于输入的,只是后者以屏幕为输入源,而前者以固定字符串为输入。
sscanf() 是从一个字符串中读进与指定格式相符的数据
二.sprintf与printf的用法很类似,只不过是前者输出到指定的目标,后者输出到屏幕。
sprintf()指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。
int scanf(const char format [,agument])
其中format可以是一个或多个
{%[
][width][{h | l | l64 | L}]}type
{a|b|c}表示a、b、c中选一,[d]表示d是可有可无的。
所以,format形式可以有:
%s
%5s
%[a-z]5d
注意:
%*[width][{h | l | l64 | L}]}type表示过滤满足条件的字符串,不向目标中输出。

1、基本用法,取字符串
string source0 = "1234456";
char str[521];
sscanf(source0.c_str(),"%s",str);
sscanf(source0.c_str(),"%4s",str);

2、转换为整型数
string source0 = "123456";
int x;
sscanf(source0.c_str(),"%d",&x);
sscanf(source0.c_str(),"%3d",&x);

3、停止和范围
sscanf(source0,"%[^a]",str); //遇到“a”停止
sscanf(source0,"%[^c]",str); //遇到“c”停止
sscanf(source0,"%[1-9A-Z]",str); //只取范围1-9和A-Z的字符
sscanf(source0,"%[^b-z]",str); //遇到“b-z”停止
sscanf(source0,"%[^c-z]",str); //遇到“c-z”停止

4、格式转换
char source[512] = "2015:8:1";
int a,b,c;
sscanf(source,"%d:%d:%d",&a,&b,&c);
注意:这个地方a、b、c必须加引用,否则会报错。

5、复杂情况
char source[512] = "fjkdsjf/123456@fjkdsjf";
char str[512];
sscanf(source,"%*[ /]/%[ @]",str);
结果为:123456

sprintf
sprintf与printf的用法很类似,只不过是前者输出到指定的目标,后者输出到屏幕。
int sprintf(char *buffer,const char *format,...)
举个例子:

结果:
1
buf = 1
buf = 00000001
2
buf = 2
buf = 00000002

⑧ c语言 sscanf(poststr,"m=%[^&]&n=%s",m,n)中的%[^&]是什么意思

%[^&]的意思是指输入的数据要遇上&才结束;
比如说在处理字符串中的scanf("%s",a);如果普通的话遇上了空格或者回车就结束了;
但把它改成这个样子scanf("%[^=]",a);就表示在输入数据中是以‘=’为结束标志的。在遇到空格和回车都不结束当前输入。
这句话有意思的地方就在于当使用这种特殊结束标志以后,这个标志不但不会被存储在对应的存储空间里,而且输出的时候按照普通方法即可输出所输入的字符;
比如我说,我输入了:
sdfasf asdfasf adf

asf
adsf
fds =
使用printf("%s",a);它就会按照原样式输出到’=‘前的位置;

⑨ C 语言中怎么截取字符串的一部分

用指针,再if判断,将+号前面的提出来放入你自定义的一个字符串中。再用一个if判断,将+号后面的放入另一个字符串中

⑩ c语言编程,关于sscanf通过中文逗号截取字符串的问题

首先我要大言不惭说一句 在C/C++版块 折腾文件 字符串 我也是前十名的人物

然后我反驳一下 楼上 sscanf是可以用正则表达式的

接下来 我回答楼主

%[^,] 这样的结构 ^后面的是单字符

而不是中文的 逗号 是双字节的

在C里算是 字符串

因此不能用在这里

阅读全文

与sscanf如何过滤相关的资料

热点内容
易语言音频文件过滤器 浏览:790
净水机超滤膜概念 浏览:266
怎么下载污水管 浏览:758
污水中的含氮化合物有哪些 浏览:533
EDI树脂怎样再生 浏览:596
菲浦斯净水器怎么代理 浏览:397
电厂污水外排怎么办 浏览:662
手表指针有水垢 浏览:198
中水回用维修公司 浏览:505
潮州净化器怎么选 浏览:988
喷漆废水中氨氮浓度一般为多少 浏览:50
如何测算污水流量 浏览:758
怎么更换转向助力油滤芯 浏览:245
生活污水截污纳管的意义 浏览:28
电热壶烧纯净水为什么有水垢 浏览:800
工业企业用水处理 浏览:768
最有效的马桶除垢方法 浏览:375
饮水机的三个灯什么意思 浏览:221
g120slvc变频器转矩提升参数 浏览:540
华为净化器1i怎么换粉 浏览:928