剛剛做了一道水題。然而雖然是水題莹桅,input卻自帶磨人屬性化焕。它的input是這樣的:
name,age,id,blah,blah,blah...
明明可以用空格解決的事情它非要用逗號,簡直是專殺用c++的孩子坝咐。
于是在網(wǎng)上搜了一番以后(并沒有搜題解!(/ω╲))析恢,我寫下了丑陋的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);
這條語句讀取字符串泽篮,以及最后一個參數(shù)可以幫我們吸收掉多余的逗號。"delim"是"delimitation"的縮寫柑船,意思是“定界”帽撑,也就是說在這里輸入的參數(shù)不僅不會被讀取,還會起到讓讀取指針停止的作用鞍时。所以第一條語句cin.getline(InName,100,',')
幫我們把name讀入InName這個size為100的數(shù)組之中亏拉,到‘,’時停下逆巍。
當(dāng)然及塘,如果真的用了"cin.getline()"這個寫法,請一定要記得包頭文件(感覺除了我以外大部分人都不會忘記锐极。笙僚。。_(:зゝ∠)):
#include<iostream>
using namespace std;
然后用cin<<InAge;
讀入int類型的age灵再。接下來的逗號可以用a=getchar();
來吸收掉肋层。
以下同理,就不多解釋了翎迁。
另外補播一則花絮:神一樣的弟弟告訴我栋猖,cin
的讀取速度非常慢,所以在算法競賽中非常不推薦使用鸳兽。還是要好好練習(xí)printf
和scanf
呀掂铐。用好了也堪稱神器的。
這一則心酸故事講完了,下面講講其他的不得不提的不堪回首的血淚史全陨。
個人認(rèn)為如果題目告訴我們會有多少個輸入樣例爆班,這種input是比較好寫的,直接一個for循環(huán)加合法判定就可以搞定辱姨。然而如果題目很腹黑地沒有告訴我們柿菩,就需要由我們自己來判斷是否還有剩余樣例。這里給兩個小例子雨涛,方法都差不多:
#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
的時候會自己停手替久。以及這里推薦一個很好用的函數(shù)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);
}
......
}
循環(huán)里的scanf負(fù)責(zé)判斷EOF,以及讀取結(jié)構(gòu)體中的第一個元素蚯根;循環(huán)內(nèi)部的scanf負(fù)責(zé)讀取結(jié)構(gòu)體第二個元素后众。思路和上面的方法差不多:因為有位運算符號"~",所以只要沒到EOF颅拦,scanf就會一直讀下去蒂誉。
最后說一下gets()吧~用來讀取一行的指令。很多人不推薦用gets()因為它事實上已經(jīng)被c++拋棄了距帅。但是在有些謎一樣專門摳輸入的題目面前右锨,gets()有時候可以發(fā)揮出它獨有的功能。
來來來碌秸,我們一起來一發(fā)水題:UVa 227
一看到這道題绍移,我便領(lǐng)悟到,哎呀哮肚,這不就是傳說中的水題嗎登夫。然而敲起來以后,我才發(fā)現(xiàn)允趟,原來我還是圖樣恼策。。潮剪。輸入輸出簡直是個坑涣楷。。抗碰。
就簡單說下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()什么的碳褒。但因為我自己也沒搞清楚折砸,所以以后再說~
就醬。
特別鳴謝:
神一樣的弟弟