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的对象调用其相应的方法,将此资源读取(即所谓的“下载”) ...
随机推荐
- CodeForces Round #298 Div.2
A. Exam 果然,并没有3分钟秒掉水题的能力,=_=|| n <= 4的时候特判.n >= 5的时候将奇数和偶数分开输出即可保证相邻的两数不处在相邻的位置. #include < ...
- HDU 2610 (自己完全找不到思路) Sequence one
搜索虐我千百遍,我待搜索...好吧,我还木有初恋 题意: 我开始理解题意就理解偏了,Orz 题中有n个元素构成的序列,求出前p个非递减子序列.子序列是先按长度排序的,然后按原序列先后位置排序的. 这里 ...
- UIView的user Interaction Enabled属性
A Boolean value that determines whether user events are ignored and removed from the event queue. 译: ...
- open行情
日k线 只能取8年 1分钟K线 只能取五天 前复权K线出现负数的股价 后复权K线会出现上千的股价
- android 自定义组件-带图片的textView
1. 定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> <decla ...
- Linux Shell编程(4): 逻辑运算符、逻辑表达式详解
shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测 ...
- Android如何获取系统高度、标题栏和状态栏高度
在android应用中,有时需要计算个View的位置,导致需要计算状态栏高度,标题栏高度等信息.为以后方便,在此做个简单记录. 晒代码前先了解一下android屏幕区域的划分,如下图(该图引用自此文h ...
- Hadoop学习总结之二:HDFS读写过程解析
一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public F ...
- Symfony2学习笔记之数据库操作
数据库和Doctrine让我们来面对这个对于任何应用程序来说最为普遍最具挑战性的任务,从数据库中读取和持久化数据信息.幸运的是,Symfony和Doctrine进行了集成,Doctrine类库全部目标 ...
- PHP中cookie与session总结
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. 理解:session用于单一用户与服务器的 ...