第九章 9.5.3节练习

本文通过两个具体的编程实例,展示了如何使用C++标准库中的字符串方法find_first_of和find_first_not_of来查找特定字符。首先介绍了如何定位字符串中的数字字符,接着演示了如何找出非数字字符,并对代码进行了详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习9.47:

编写程序,首先查找string “ab2c3d7R4E6”中的每个数字字符,然后查找其中每个字母字符。编写两个版本的程序,第一个要使用find_first_of, 第二个要使用find_first_not_of。

解答:

#include <iostream>
#include <string>

using namespace std;

void myFind1(const string& str){
  string::size_type pos = 0;
  string number("0123456789");
  while((pos = str.find_first_of(number, pos)) != string::npos){
    cout << "found number at index:" << pos;
    cout << " element is " << str.at(pos) << endl;
    ++pos;
  }
}

void myFind2(const string& str){
  string::size_type pos = 0;
  string number("0123456789");
  while((pos = str.find_first_not_of(number, pos)) != string::npos){
    cout << "found character at index:" << pos;
    cout << " element is " << str.at(pos) << endl;
    ++pos;
  }
}

int main(){
  string mystr("ab2c3d7R4E6");
  myFind1(mystr);
  myFind2(mystr);
}

练习9.48:

假定name和numbers的定义如325页所示,numbers.find(name)返回什么?

解答:

这里需要引用一下这两个函数的动作定义:

【引用】s.find(arg)   查找s中args第一次出现的位置

【引用】s.find_fisrt_of(arg)  在s中查找args中任何一个字符第一次出现的位置

我们在325页中可以看到number为“0123456789”, name为“r2d2”。

所以,使用find_fisrt_of会返回1.


而使用find将会返回-1,也就是string::npos。

这里相当于number全字符匹配name,在name里面无法找到number的字符串,所以会以npos作为返回值。


练习9.49:

如果一个字母延伸到中线之上,如d或f,则称其为有是上出头部分(asender)。如果一个字母延伸到中线之下,如p或g,则称其有下出头部分(descender)。编写程序,读入一个单词文件,输出最长的既不包括上出头部分,也不包括下出头部分的单词。

解答:

#include <iostream>
#include <string>

using namespace std;

const string ascender_and_desender("bdfghijkpqy");

void myNotInc(const string& str){ // 参考326页的程序写出
  string::size_type pos = 0;
  while((pos = str.find_first_not_of(ascender_and_desender, pos)) != string::npos){
    cout << str.at(pos);
    ++pos;
  }
  cout << endl;
}

int main(){
  string mystr("ab2c3d7R4E6"); // 使用上题的字符串来模拟单词文件中的内容
  myNotInc(mystr);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值