【C++Primer习题:9.5.3】首先查找string“ab2c3d7R4E6“中的每个数字,然后查找其中每个字母字符

刚看到这个不以为意,但是实际写代码时却是把我这种新手难住了,不过最后还是解决了。

【坑1】 string::npos 的理解;
【坑2】find_first_of的理解;

坑1
在C++中 string::npos 并不是网上好多人说的指字符串的结尾,这就是坑啊,而是指匹配不成功时的返回值,即-1,但是这是无符号数类型,因此-1就变成该无符号类型的最大值。
判断字符串结尾的还得用【’\0’】。

	string::size_type pos = -1;
	cout<<"pos:"<<pos<<endl;
	cout<<"npos:"<<string::npos<<endl;
	//你会发现这个这两个一样,是一个很大很大的无符号整数

坑1
string的查找函数,如果匹配不到返回的都是这个数:string::npos;

习题与代码程序
理解这两个,就简单多了下面上代码:
【C++Primer 第五版】9.5.3习题:
编写程序:首先查找string"ab2c3d7R4E6"中的每个数字,然后查找其中每个字母字符。编写两个版本的程序,第一个使用find_first_of,第二个要使用find_first_not_of。

第一种:使用 find_first_of

#include<string>
#include<iostream>
using namespace std;
int main()
{
	string str = "ba2c3d7R4E666E";
	string numbers("23746");
	string alphabets("abcdRE");
	string::size_type pos = 0;

	cout<<"数字:{";
	while(str[pos] != '\0')
	{
		// find_first_of如果没找到返回无符号数-1,也就是最大值
		// 为什么要在这里加个判断:因为,当pos是最后一个字符的下标时,如果此此时没找到,
		// 函数就返回无符号数最大值(无符号数最大值=-1),此时采用下标访问元素:str[-1]就会导致报错。
		if(str.find_first_of(numbers,pos) == string::npos)
			break;
		else
			pos = str.find_first_of(numbers,pos);
		cout<<str[pos]<<",";
		pos++;
	}
	cout<<"}"<<endl;
	
	pos = 0;
	cout<<"字母:{";
	while(str[pos] != '\0')
	{
		// find_first_of如果没找到返回无符号数-1,也就是最大值
		// 为什么要在这里加个判断:因为,当pos是最后一个字符的下标时,如果此此时没找到,
		// 函数就返回无符号数最大值(无符号数最大值=-1),此时采用下标访问元素:str[-1]就会导致报错。
		if(str.find_first_of(alphabets,pos) == string::npos)
			break;
		else
			pos = str.find_first_of(alphabets,pos);
		cout<<str[pos]<<",";
		pos++;
	}
	cout<<"}"<<endl;
}

第二种:使用find_first_not_of

#include<string>
#include<iostream>
using namespace std;
int main()
{
	string str = "ba2c3d7R4E666E";
	string numbers("23746");
	string alphabets("abcdRE");
	string::size_type pos = 0;

	cout<<"数字:{";
	while(str[pos] != '\0')
	{
		if(str.find_first_not_of(alphabets,pos) == string::npos)
			break;
		else
			pos = str.find_first_not_of(alphabets,pos);
		cout<<str[pos]<<",";
		pos++;
	}
	cout<<"}"<<endl;
	
	pos = 0;
	cout<<"字母:{";
	while(str[pos] != '\0')
	{
		if(str.find_first_not_of(numbers,pos) == string::npos)
			break;
		else
			pos = str.find_first_not_of(numbers,pos);
		cout<<str[pos]<<",";
		pos++;
	}
	cout<<"}"<<endl;
}

欢迎来讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘猫掸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值