首先,先说明一下sscanf与scanf的区别
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的任意字符,贪婪性
原文连接
我们可以通过sscanf处理已经读入的字符串。
- 不要使用getline!会导致无法输入
- sscanf时一定不要忘记取地址‘&’符号。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int x1,x2;
char later[n][100];
for (int i = 0; i < n; i++) {
char temp[10]="";
char t;
scanf("%s",temp);
if(temp[0]>='a' && temp[0]<='z'){
cin>>x1>>x2;
t=temp[0];
if(temp[0]=='a'){
sprintf(later[i],"%d+%d=%d",x1,x2,x1+x2);
}
if(temp[0]=='b'){
sprintf(later[i],"%d-%d=%d",x1,x2,x1-x2);
}
if(temp[0]=='c'){
sprintf(later[i],"%d*%d=%d",x1,x2,x1*x2);
}
}else{
sscanf(temp,"%d",&x1);
//这里一定要取地址
temp[0]=t;
cin>>x2;
if(temp[0]=='a'){
sprintf(later[i],"%d+%d=%d",x1,x2,x1+x2);
}
if(temp[0]=='b'){
sprintf(later[i],"%d-%d=%d",x1,x2,x1-x2);
}
if(temp[0]=='c'){
sprintf(later[i],"%d*%d=%d",x1,x2,x1*x2);
}
}
}
for (int j = 0; j < n; j++) {
cout<<later[j]<<endl<<strlen(later[j])<<endl;
}
return 0;
}