accelerated C++ 中查找url(学习笔记)
这个程序用来查找被称为url(统一资源地)的万维网地址,输入一行包含url的字符串,程序会帮你识别并输出字符串里所包含的全部url。
url的格式: protocol-name(协议名称)://resource-name(资源名称)
在看这个程序之前,记录一下这一章接触的新的知识点:
1.isalnum(c)函数:
在#<cctype>中定义,如果c是一个字母或者数字则结果是true
其余类似的函数有:
isspace(c) 如果c是一个空白字符则结果为true isalpha(c)如果c是一个字母字符则为true
isdigit(c) 如果是一个数字字符则为true ispunct(c如果是一个标点字符则结果为true
isupper(c) 如果是一个大写字母则结果为true islower(c)如果c 是一个小写字母则为true
toupper(c) 产生一个等于c的大写字母 tolower(c)产生一个等于c的小写字母
2.find_if函数:
find_if(a,b,c) 包含3个参数,前两个参数表示查找范围,是迭代器类型,第三个参数是一个函数指针或者函数对象,它的的作用是在容器范围内,返回一个使第三个参数所指函数为真的元素的迭代器
find函数:
与find_if 有点类似,但和find_if不同,它不会调用第三个参数所给定的值,反而会去查找做给的第三个参数,如果找到,则返回第三个参数的迭代器,没找到,就返回第二个参数的迭代器。
search函数:
search(a,b,c,d) 第一队迭代器指示了一对我们要查找的的序列,第二对指示了一个序列——我们希望为这个序列定位
(三个都是在#include <algorithm>中)
下面先简单介绍程序中的几个函数:
vector<string> find_urls(const string& s) //通过用迭代器d查找“://” 以查找查找全部的url
string::const_iterator url_beg(string::const_iterator b,string::const_iterator e) //查找url的前面部分
string::const_iterator url_end(string::const_iterator b,string::const_iterator e) //查找url的后面部分
bool not_url_char(charc) //如果传过来的字符不可能出现在url中,则返回true
下面是整个函数,外加一个main的测试函数:
#include<iostream>
#include<string>
#include<vector>
#include<cctype>
#include<algorithm>
using namespace std;
bool not_url_char(char c){
//除去字母数字之外,其他可能出现的urlzifu
static const string url_ch = "~;/:@=&_.+!'(),"; //static是静态变量,有全局寿命
return !(isalnum(c) ||
find(url_ch.begin(),url_ch.end(),c) !=url_ch.end()); //检查字符c是否有出现
}
string::const_iterator
url_beg(string::const_iterator b,string::const_iterator e){
static const string sep = "://";
typedef string::const_iterator iter; //简化字符串的迭代器
iter i = b; //i标记查找到的分隔符:
while((i = search(i,e,sep.begin(),sep.end())) !=e) { if(i != b && i+sep.size() != e){
iter beg = i; //beg标记协议的名称的头部
while(beg!=b&&isalpha(beg[-]))
--beg;
if(beg!=i && !not_url_char(i[sep.size()])) //分隔符前后至少有一个字符
return beg;
}
i+=sep.size(); //所找到的分隔符不是一个url的部分
}
return e;
}
string::const_iterator //url_end 函数
url_end(string::const_iterator b,string::const_iterator e){ return find_if(b,e,not_url_char);
}
vector<string> find_urls(const string& s){
vector<string> ret;
typedef string::const_iterator iter;
iter b = s.begin(), e = s.end(); while(b!=e){ //检查整个输入
b = url_beg(b,e); //查找一个或多个紧跟着://d 字母 if(b!=e){ //如果查找成功获取此url的其余部分
iter after = url_end(b,e);
ret.push_back(string(b,after)); //记住这个url b = after; //向前推进
}
}
return ret;
}
int main(){ //用于测试的主函数
string s;
getline(cin,s);
vector<string> v=find_urls(s);
for(vector<string>::size_type i =;i<v.size();++i)
cout<<v[i]<<endl;
return ;
}
accelerated C++ 中查找url(学习笔记)的更多相关文章
- ES6中Map数据结构学习笔记
很多东西就是要细细的品读然后做点读书笔记,心理才会踏实- Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制. 1234 var d = {}var e ...
- 我的Android进阶之旅------>Android中编解码学习笔记
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- JavaSE中Map框架学习笔记
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
- C++中的ravalue学习笔记
一.学习笔记 1. A a = 42; 会先以42为参数构造一个A类对象,然后调用拷贝构造函数来构造a,目前编译器优化掉了拷贝构造函数的调用,测试拷贝构造函数是没有被调用的,但是其权限不能为priva ...
- 由一段字符串中查找URL引出——正则表达式
需求很简单,是从一段文本中匹配出其中的超链接.基本的做法就是用正则表达式去匹配.但是有这样一个问题. 网上大部分的识别URL的正则表达式url末尾有空格的情况下可以正确识别.比如这样的情况: &quo ...
- Android中的Telephony学习笔记(2)
上一篇文章中学习了android.provider中Telephony类. 这一篇文章学习android.telephony包中的类,这些类是android提供给上层调用的API. 为监測基本电话信息 ...
- 关于高淇JAVA中SORM总结学习笔记详细个人解释
代码来源于高淇JAVA教学视频 谢谢高淇老师的教学. 因为自己在学习的过程中发现了很多困难点,总结下希望对自己接下来学框架提升.给像我一样得初学者方便. SORM框架是一个简单的ORM,关系对象映射, ...
- Python中的redis学习笔记
redis是一个key-value结构的数据库,value的格式可以使string,set,list,map(即python里面的dict),sorted set(有序集合) 1.初始化 1)直接连接 ...
- URL学习笔记
不多说,先上代码,代码的注释写的已经挺详细的了 //URL:统一资源定位符,一个URL的对象,对应着互联网上的一个资源. //我们可以通过URL的对象调用其相应的方法,将此资源读取(即所谓的“下载”) ...
随机推荐
- Win7平台下Cocos2d-x环境搭建
一.Win7下Cocos2d-x环境搭建 Cocos开发者平台官网——在这里下载游戏引擎 解压放到某个目录下即可 https://www.python.org/downloads/ ...
- Sass中的mixin,function,extend
Mixins: 用于相类似的css属性将会被使用多次,每次调用时仅仅有小的参数改变: Function 用于计算得出相关值: Extend 有一批属性完全匹配时,应该使用extend
- Qt之QLabel
简述 QLabel提供了一个文本或图像的显示,没有提供用户交互功能. 一个QLabel可以包含以下任意内容类型: 内容 设置 纯文本 使用setText()设置一个QString 富文本 使用setT ...
- poj2750 线段树 +DP Potted Flower
问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列. 算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最 ...
- UVa 136 Ugly Numbers【优先队列】
题意:给出丑数的定义,不能被除2,3,5以外的素数整除的的数称为丑数. 和杭电的那一题丑数一样--这里学的紫书上的用优先队列来做. 用已知的丑数去生成新的丑数,利用优先队列的能够每次取出当前最小的丑数 ...
- wince6下载地址
http://geekswithblogs.net/WindowsEmbeddedCookbook/archive/2010/08/31/installing-windows-ce-6.0-tools ...
- Jenkins+Maven+SVN搭建自动部署、自动测试环境
.打开http://10.3.15.78:8080/jenkins/,第一次进入里面没有数据,我们需要创建job,我们这有2个项目,需要创建2个job.http://10.3.34.163:9890/ ...
- /etc/selinux/config
/etc/selinux/configSELINUX=disabled改成了SELINUX=enforcing机器无法启动 linux无法启动怎么解决:[1]selinux配置错误 SELinux 入 ...
- 最大熵模型 Maximum Entropy Model
熵的概念在统计学习与机器学习中真是很重要,熵的介绍在这里:信息熵 Information Theory .今天的主题是最大熵模型(Maximum Entropy Model,以下简称MaxEnt),M ...
- 平时学习HTML5及其安全相关的一些站点资源
http://www.w3.org/ -- HTML5一切标准都来自这里,如果你是发烧级HTML5患者,就读这个http://www.whatwg.org -- 和W3分分合合,最终共同指定HTML5 ...