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的对象调用其相应的方法,将此资源读取(即所谓的“下载”) ...
随机推荐
- 5个缺失的 JavaScript 数字格式化函数
/** 下面两个函数都能对浮点数进行四舍五入,保留小数点后两位 **/ function CurrencyFormatted(amount) { var i = parseFloat(amount); ...
- 用VS2005开发WinCE程序调试图文教程
一.WinCE 模拟器通过ActiveSync 6.1(即Windows Mobile设备中心)连接P 1.启动WinCE模拟器 命令行: start .\DeviceEmulator.exe WI ...
- IE 火狐浏览器对时间格式的兼容性;使用原型对象的方式 prototype关键字;时间格式化
在ie中 时间格式如果用横杠来显示 "2013-05-10 19:20:59" 是可以正确识别的(如果用斜杠,IE也可以正确识别), 但是如果是火狐,则只能识别斜杠模式 &quo ...
- java注解Annotation
扯扯注解的蛋 为什么学习注解?学习注解有什么好处?学完能做什么? 1.能够读懂别人的代码,特别是框架相关的代码 2.让编程更加简洁,代码更加清晰 3.让别人高看你一眼 注解是java1.5引入的 概念 ...
- 详解Android动画之Frame Animation(转)
在开始实例讲解之前,先引用官方文档中的一段话: Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画.Frame动画可以被定义在XML文件中,也可以完全编码实现. ...
- HDU1026 Ignatius and the Princess I
解题思路:打印路径是关键,细节处理见代码. #include<cstdio> #include<cstring> #include<algorithm> using ...
- In App Purchase翻译
一.In App Purchase概览 Store Kit代表App和App Store之间进行通信.程序将从App Store接收那些你想要提供的产品的信息,并将它们显示出来供用户购买.当用户需要购 ...
- js 只能输入数字和小数点
<html><head><meta http-equiv="content-Type" content="text/html;charset ...
- poj 1472(递归模拟)
题意:就是让你求出时间复杂度. 分析:由于指数最多为10次方,所以可以想到用一个数组保存各个指数的系数,具体看代码实现吧! 代码实现: #include<cstdio> #include& ...
- C#中的枚举类型(enum type)
ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, B ...