刚看到这个不以为意,但是实际写代码时却是把我这种新手难住了,不过最后还是解决了。
【坑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;
}
欢迎来讨论