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数组进行比较,相同的话就跳过,直接输出,

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值