本题要求你计算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数组进行比较,相同的话就跳过,直接输出,