这个程序用来查找被称为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(学习笔记)的更多相关文章

  1. ES6中Map数据结构学习笔记

    很多东西就是要细细的品读然后做点读书笔记,心理才会踏实- Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制. 1234 var d = {}var e ...

  2. 我的Android进阶之旅------>Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  3. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  4. C++中的ravalue学习笔记

    一.学习笔记 1. A a = 42; 会先以42为参数构造一个A类对象,然后调用拷贝构造函数来构造a,目前编译器优化掉了拷贝构造函数的调用,测试拷贝构造函数是没有被调用的,但是其权限不能为priva ...

  5. 由一段字符串中查找URL引出——正则表达式

    需求很简单,是从一段文本中匹配出其中的超链接.基本的做法就是用正则表达式去匹配.但是有这样一个问题. 网上大部分的识别URL的正则表达式url末尾有空格的情况下可以正确识别.比如这样的情况: &quo ...

  6. Android中的Telephony学习笔记(2)

    上一篇文章中学习了android.provider中Telephony类. 这一篇文章学习android.telephony包中的类,这些类是android提供给上层调用的API. 为监測基本电话信息 ...

  7. 关于高淇JAVA中SORM总结学习笔记详细个人解释

    代码来源于高淇JAVA教学视频 谢谢高淇老师的教学. 因为自己在学习的过程中发现了很多困难点,总结下希望对自己接下来学框架提升.给像我一样得初学者方便. SORM框架是一个简单的ORM,关系对象映射, ...

  8. Python中的redis学习笔记

    redis是一个key-value结构的数据库,value的格式可以使string,set,list,map(即python里面的dict),sorted set(有序集合) 1.初始化 1)直接连接 ...

  9. URL学习笔记

    不多说,先上代码,代码的注释写的已经挺详细的了 //URL:统一资源定位符,一个URL的对象,对应着互联网上的一个资源. //我们可以通过URL的对象调用其相应的方法,将此资源读取(即所谓的“下载”) ...

随机推荐

  1. 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    一种分类是推和拉 . 还有一种分类是 Queue 和 Pub/Sub . 先看的这一篇:http://blog.csdn.net/heyutao007/article/details/50131089 ...

  2. js之dom_1

    DOM    ie中有dom对象都是com对象的形式实现的    操作dom时,要注意返回的节点列表.属性列表都是动态的,会随着操作的改变而实时改变    document.getElementByI ...

  3. SharePoint的实体生成

    生成Linq实体 使用SPMetal工具生成Linq to SharePoint实体 工具安装目录: C:\Program Files\Common Files\Microsoft Shared\We ...

  4. BZOJ 4415 发牌

    线段树就好了啊. 为什么一眼splay啊... 其实splay也能过,但是线段树更方便? #include<iostream> #include<cstdio> #includ ...

  5. 深入理解 AngularJS 的 Scope(转)

    一.遇到的问题 问题发生在使用 AngularJS 嵌套 Controller 的时候.因为每个 Controller 都有它对应的 Scope(相当于作用域.控制范围),所以 Controller ...

  6. MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务

    如果您的应用需要通过脚本快速创建一个或多个MySQL数据库,MySQL Database on Azure目前开放了对于PowerShell的支持,可以帮助您快速利用自动化脚本进行数据库服务的创建.管 ...

  7. ORACLE学习笔记 索引和约束

    /*** 约束 ***/ * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约 束,但如果某个约束作用于多个字段,  必须在表级定义约束* 在定义约束时可以通过CONSTRA ...

  8. 【转】Android Interface的使用

    原文网址:http://www.3g-edu.org/Android_free/art115.htm Android应用程序采用Java语言编写,Java语法和C/C++有很大的相似性,但也有一些特别 ...

  9. Spring 框架概述

    ◆简介 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用 Spring 框架是一个分层架构,由 7 个定义良好的模块组成. ...

  10. Java读写大文本文件(2GB以上)

    如下的程序,将一个行数为fileLines的文本文件平均分为splitNum个小文本文件,其中换行符'r'是linux上的,windows的java换行符是'\r\n': package kddcup ...