摘自:http://blog.sina.com.cn/s/blog_6757155901013068.html
scanf()函数中%[]格式控制符用法
scanf()函数中%[]格式控制符用法
作者:武汉华嵌-嵌入式培训中心
此格式控制符的基本格式为:%[scanfset]
scanfset 有两种形式:一种是以非 “^” 字符开头的 scanset , 表示在读入字符串时将匹配所有在 scanfset 中出现的字符,遇到非scanfset 中的字符时输入就结束;另外一种形式是以 “^” 字符开头的scanfset ,表示在读入字符串时将匹配所有不在scanfset 中出现的字符,遇到scanfset 中的字符输入就结束。
测试代码 1 :
#include
int main()
{
}
输入 :hhhh
Vc6.0的输出结果:
Ubuntu10.04的输出结果:
“-”字符的使用。当“-”出现在scanfset中且两边都有字符时,大多数编译器都做了如下所述实现:“-”表示匹配从其左边的字符到右边字符之间所有的字符(按ASCII码排序)。如a-z表示a到z的所有字符,又如0-9表示0到9这十个数字。所以,当scanfset为0-9时表示只匹配数字串,当scanfset为A-Za-z时表示只匹配字符(包括大小写),当scanfset为^0-9时不匹配所有数字。注意,“-”的字符只有在其左右两边都有有效字符时才有这个作用,否则被认为是普通字符,如“ 0-4-6-9”匹配的字符为{0,1,2 ,3,,4, -, 6,7,8,9},这样也为输入“-”字符提供了方法。
测试代码 2 :
#include
int main()
{
char str[40] = { 0 } ;
}
Vc6.0输出结果:
Ubuntu10.04输出结果:
注意:
当要匹配右侧 “]” 或者 “^” 时,得这样去做。如果是右侧方括号时,得把它放在紧跟在左侧方括号的后边,也不可以有空格,如:%[]ajdfidfj ] ;如果是 “^” 时,得不可以把它置于紧跟在左侧方括号的后边,如:%[ gfadhfu^fhgiu ] 。
测试代码 3 :
#include
int main()
{
char str[40] = { 0 } ;
}
输入:hao^
Vc6.0输出结果:
Ubuntu10.04输出结果:
测试代码 4 :
#include
int main()
{
}
输入:hao]^
Vc6.0输出结果:
Ubuntu10.04输出结果:
测试代码 5 :
#include
void put()
{
}
int main()
{
//
//
printf("%s\n\n",str2);
//
//
}
输入:nihao^ 然后按回车键,整个程序就结束了。
输出:
Vc6.0的输出结果
Ubuntu10.04输出的结果:
在vc6.0中,当去掉fflush()或者 getchar()的注释时:
结果:
在ubuntu10.04中,当去掉getchar()的注释时:
结果:
hao^
hao]
hao^
(原文出处:武汉华嵌 http://www.embedhq.org/, 转载请注明出处)
scanf("%*[^\n]%*c")是用扫描集将缓冲区中的字符全部读取来实现清除缓冲区的动作。 %*〔^\n〕将逐个读取缓冲区中的'\n'字符之前的其它字符,%后面的*表示将读取的这些字符丢弃,前遇到'\n'字符时便停止读取操作,此时,缓冲区中尚有一个'\n'字符遗留,所以后面的%*c将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个'\n'字符,所以将'\n'连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。