sscanf与scanf类似,都是用于输入的,只是后者以键盘为输入源,前者以固定字符串为输入源。
sscanf()函数返回值是int型,代表有多少个变量被赋值了。
比如有些题目中有这样的输入:2012:12:20:Monday,现在要把它们提取出来分别处理,那么用sscanf()就很方便了。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
char str[25];
char S[25];
int main()
{
int y,m,d;
while(cin.getline(str,25))
{
sscanf(str,"%d:%d:%d:%s",&y,&m,&d,S);
cout<<y<<" "<<m<<" "<<d<<" "<<S<<endl;
}
return 0;
}
这样顺便提一下cin.get()和cin.getline()都是C++中用来读取字符串的方法。
其中里面的参数形式表现为cin.get(str,len)或cin.getline(str,len),len为读取的字符串的最大长度。它们都可以读
取含有空格的字符串。
注意cin.get()在读取字符串后如果按下回车,那么此时的回车这个字符进入缓冲区,并不会被抛弃,所以就相当于C语言中
的%c输入字符按下回车后一样。而对于cin.getline()可以过滤回车,跟C语言中的gets()一样。
在sscanf()中,如果指定格式为%*d,%*s等等,那么此项被表示跳过不读。
另外sscanf()还可以指定输出,而且支持正则表达式,比如:
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); //读取仅包含数字和小写字母的字符
sscanf("123456 abcdedf", "%[^ ]", buf); //遇到空格就停止读取
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); //遇到大写字母就停止读取
sscanf("12345#6abcdedfBCD@EFf", "%*[^#]#%[^@]", buf); //取出#和@之间的字符