【C/C++】記錄下gets,cin.getline清除換行方式
競賽中經常出現:
輸入格式
第1行:1個n,表示指令數量 第2..n+1行:每行給出一條指令。指令序列xxxxxxxx
嗯 沒錯,然後一般就很多直接擼出了如下程式碼:
int length=0;
char* inputText=(char*)malloc(xLength);
cin>>length;
for(int i=0;i<length;i++){
cin.getline(inputText,length);
...
}
或純C操作,
int length=0;
char* inputText=(char*)malloc(xLength);
scanf(%d,&length);
for(int i=0;i<length;i++){
gets(inputText);
...
}
這樣,就會出現少了一行的情況,這是因為前面的輸入流在使用者輸入的時候還存有一個回車換行符,下面的第一個gets或者getline則會把這個空資料的符號也讀作一行,從而造成了少一行的情況。
解決方案:
純C:
scanf()後使用getchar()吸收一個換行符
int length=0;
char* inputText=(char*)malloc(xLength);
scanf(%d,&length);
getchar();//吸收換行大法
for(int i=0;i<length;i++){
gets(inputText);
...
}
C++中的STL庫則使用cin.ignore()忽略前面的資料流,這裡忽略,即前面的那個換行符
int length=0;
char* inputText=(char*)malloc(xLength);
cin>>length;
cin.ignore();//這也吸收。(cin.ignore()還有其他引數,具體用法可參考百度或者msdn,這裡只是競賽中可常用的一種方法。請勿當作標準)
for(int i=0;i<length;i++){
cin.getline(inputText,length);
...
}
經過以上處理一般就可以達到我們競賽中題目要求輸入的效果啦。