刚刚做了一道水题。然而虽然是水题,input却自带磨人属性。它的input是这样的:
name,age,id,blah,blah,blah...
明明可以用空格解决的事情它非要用逗号,简直是专杀用c++的孩子。
于是在网上搜了一番以后(并没有搜题解!(/ω╲)),我写下了丑陋的input代码,总算糊弄过去了_( :зゝ∠):
char a; // comma storage
char InName[100]; int InAge; char InIdNum[100];
int InGrade1; int InGrade2; int InGrade3; int InGrade4;
//freopen("test.txt","r",stdin);
cin.getline(InName, 100, ',');
cin>>InAge;
a = getchar();
cin.getline(InIdNum, 100, ',');
cin>>InGrade1>> a >>InGrade2>> a >>InGrade3>> a >>InGrade4;
因为cin
可以忽略掉逗号所以我们要集中火力解决字符串读取的问题。可以用std::istream::getline(char* s, streamsize n, char delim);
这条语句读取字符串,以及最后一个参数可以帮我们吸收掉多余的逗号。"delim"是"delimitation"的缩写,意思是“定界”,也就是说在这里输入的参数不仅不会被读取,还会起到让读取指针停止的作用。所以第一条语句cin.getline(InName,100,',')
帮我们把name读入InName这个size为100的数组之中,到‘,’时停下。
当然,如果真的用了"cin.getline()"这个写法,请一定要记得包头文件(感觉除了我以外大部分人都不会忘记。。。_(:зゝ∠)):
#include<iostream>
using namespace std;
然后用cin<<InAge;
读入int类型的age。接下来的逗号可以用a=getchar();
来吸收掉。
以下同理,就不多解释了。
另外补播一则花絮:神一样的弟弟告诉我,cin
的读取速度非常慢,所以在算法竞赛中非常不推荐使用。还是要好好练习printf
和scanf
呀。用好了也堪称神器的。
这一则心酸故事讲完了,下面讲讲其他的不得不提的不堪回首的血泪史。
个人认为如果题目告诉我们会有多少个输入样例,这种input是比较好写的,直接一个for循环加合法判定就可以搞定。然而如果题目很腹黑地没有告诉我们,就需要由我们自己来判断是否还有剩余样例。这里给两个小例子,方法都差不多:
#include <stdio.h>
#include <string.h>
while(scanf("%s%s", s, t) != EOF){
int i, j, slen, tlen;
slen = strlen(s);
tlen = strlen(t);
......
}
恩,喜闻乐见的字符串处理。scanf
在碰到EOF
的时候会自己停手。以及这里推荐一个很好用的函数strlen(s)
可以直接获得输入字符串的长度。
另外一个判断EOF的方法:
while(~scanf("%d", &a[0].x)){
scanf("%d",&a[0].y);
if(a[0].x>a[0].y) swap(a[0].x,a[0].y);
for(int i=1;i<6;i++){
scanf("%d%d",&a[i].x,&a[i].y);
if(a[i].x>a[i].y) swap(a[i].x,a[i].y);
}
......
}
循环里的scanf负责判断EOF,以及读取结构体中的第一个元素;循环内部的scanf负责读取结构体第二个元素。思路和上面的方法差不多:因为有位运算符号"~",所以只要没到EOF,scanf就会一直读下去。
最后说一下gets()吧~用来读取一行的指令。很多人不推荐用gets()因为它事实上已经被c++抛弃了。但是在有些谜一样专门抠输入的题目面前,gets()有时候可以发挥出它独有的功能。
来来来,我们一起来一发水题:UVa 227
一看到这道题,我便领悟到,哎呀,这不就是传说中的水题吗。然而敲起来以后,我才发现,原来我还是图样。。。输入输出简直是个坑。。。
就简单说下gets()
在这题里的神通吧~虽然我并没有ac_(:зゝ∠)。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int c;
char a[6][6]; char s[1000];
int x,y;
int main(void){
//freopen("uva227.txt","r",stdin);
int kase=0;
while(gets(a[0])){
if(strcmp(a[0],"Z")==0)return 0;
for(int i=1;i<5;i++) gets(a[i]);
memset(s,-1,sizeof(char));
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(a[i][j]==' '){
x=i;y=j;
}
}
}
......
}
除了上面提到的这些,c++还有很多其他深藏功与名的黑科技,比如getchar()什么的。但因为我自己也没搞清楚,所以以后再说~
就酱。
特别鸣谢:
神一样的弟弟