本題要求你計算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數組進行比較,相同的話就跳過,直接輸出,