pat刷題之路之L1-011 A-B

本題要求你計算A-B。不過麻煩的是,A和B都是字符串 —— 即從字符串A中把字符串B所包含的字符全刪掉,剩下的字符組成的就是字符串A-B。

輸入格式:

輸入在2行中先後給出字符串A和B。兩字符串的長度都不超過10^4^,並且保證每個字符串都是由可見的ASCII碼和空白字符組成,最後以換行符結束。

輸出格式:

在一行中打印出A-B的結果字符串。

輸入樣例:

I love GPLT!  It's a fun game!
aeiou

輸出樣例:

I lv GPLT!  It's  fn gm!

這題弄得我很尷尬,本來就是半路出家,沒怎系統學過c++,對一些基礎知識掌握的不是特別牢固,一開始我本來想用char數組來存儲這些字符,後來發現在輸入的時候就遇到了困難,由於cin>>遇到空格回車是自動結束,所以空格是讀不到char數組裏的,這裏我查了下cin的幾種輸入方式,如下:

1.cin   該操作符是根據後面變量的類型讀取數據。

輸入結束條件:遇到Enter、Space、Tab鍵。

對結束符的處理:丟棄緩衝區中使得輸入結束的結束符(Enter、Space、Tab)

cin會檢查輸入格式,輸入與預期格式不符時,會返回false,正常情況下則會返回輸入流本身;

 

2.cin.get(數組名,長度,結束符)

其中結束符爲可選參數,讀入的字符個數最多爲長度減1個,結束符規定結束字符串讀取的字符,默認爲ENTER。

1.讀取字符的情況:

若要讀取字符,直接cin.get(char ch)或ch=cin.get()即可。

輸入結束條件:Enter鍵

對結束符處理:不丟棄緩衝區中的Enter

cin.get()與cin.get(char ch)用於讀取字符,他們的使用是相似的,即:ch=cin.get()與cin.get(ch)是等價的。若文件讀取最好使用文件流.get(ch)。

3 cin.getline讀取一行

函數作用:從標準輸入設備鍵盤讀取一串字符串,並以指定的結束符結束。 
函數原型有兩個:

istream& getline(char* s, streamsize count); //默認以換行符結束
istream& getline(char* s, streamsize count, char delim);

 

#include <iostream>
using namespace std;
int main()
{
    char array[20]={NULL};
    cin.getline(array,20); //或者指定結束符,使用下面一行
    //cin.getline(array,20,'\n');
    cout<<array<<endl;
    system("pause");
    return 0;
}

注意,cin.getline與cin.get的區別是,cin.getline不會將結束符或者換行符殘留在輸入緩衝區中。

 

4 getline讀取一行

C++中定義了一個在std名字空間的全局函數getline,因爲這個getline函數的參數使用了string字符串,所以聲明在了< string>頭文件中了。

getline利用cin可以從標準輸入設備鍵盤讀取一行,當遇到如下三種情況會結束讀操作:1)到文件結束,2)遇到函數的定界符,3)輸入達到最大限度。

當我輸入n的值爲2 並以回車爲結束的時候,下邊的循環直接進行了兩次。原因可以分爲兩方面,第一是默認情況下,getline以‘\n’爲結束標誌,如果你把getline的第三個參數設置爲‘#’,則不會出現上述情況。第二,從輸入的六狀態找原因,網上的答案有的說用cin.clear(),有的說要cin.clear()和cin.ignore()一起用纔有效。在這裏我參考了網上的各種版本以及自己的實踐經歷總結如下:

cin.clear():重置流的狀態,使之有效。也就是說如果想要消除錯誤輸入的影響,需要添加此函數。

cin.ignore(): 忽略當前緩衝區的第一個字符(即回車)。

所以要結合自己的情況使用這兩個函數,事實是在我的函數中值需要使用cin.ignore()就可以了。 

函數原型有兩個重載形式:

istream& getline ( istream& is, string& str);//默認以換行符結束
istream& getline ( istream& is, string& str, char delim);

用示例:

#include <string> 
#include <iostream>
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    cout<<str<<endl;
    system("pause");
    return 0;
}

輸入:hello world[回車],輸出: 
這裏寫圖片描述

注意,getline遇到結束符時,會將結束符一併讀入指定的string中,再將結束符替換爲空字符。因此,進行從鍵盤讀取一行字符時,建議使用getline,較爲安全。但是,最好還是要進行標準輸入的安全檢查,提高程序容錯能力。

cin.getline()類似,但是cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數。

最後這裏借用一個別人的比較好的方法,解決這個問題

因爲都是ASCII嗎,所以這裏定義了一個book數組,大小爲256,

 

#include <iostream>
#include<string>
using namespace std;
int book[256];
int main() {
	string s, a;
	getline(cin, s);
	getline(cin, a);
	for (int i = 0; i < a.length(); i++) {
		book[a[i]] = 1;
	}
	for (int i = 0; i < s.length(); i++) {
		if (book[s[i]] == 1) {
			continue;
		}
		cout << s[i];
	}
	

	system("pause");
	return 0;
}

這裏將要減去的值在數組中置1,再與A數組進行比較,相同的話就跳過,直接輸出,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章