Accelerated C++ chapter 06查找URL

原创 2018年04月17日 21:12:45

可能是我还比较菜,感觉这个程序写起来好绕啊,调了好多次才调通,下面放完代码去跑步了。

main.cpp

#include <iostream.h>
#include <vector.h>
#include <string.h>
#include <cctype>
#include "find_urls.h"

using std::vector;
using std::string;
using std::cin; 
using std::cout;
using std::endl;
using std::getline;

int main(){
	string s;
	while(getline(cin,s)){
		vector<string> v = find_urls(s); 
		for(vector<string>::const_iterator i = v.begin(); i != v.end();++i)
		cout<<*i<<endl;
	} 
	return 0;
}

然后是find_url()和其他几个函数体

#include <iostream.h>
#include <string.h>
#include <cctype>
#include <algorithm>
#include <vector.h>
#include "find_urls.h"

using std::string;		using std::vector;
using std::find;		using std::find_if;
using std::isalpha;		using std::isalnum;
using std::search;

string::const_iterator 
url_begin(string::const_iterator b,string::const_iterator e){
	static const string sep = "://";
	 
	typedef string::const_iterator iter;
	iter i = b;
	while((i = search(i,e,sep.begin(),sep.end())) != e){
	
		if(i != b && i + sep.size() !=e){
			iter begin = i;
			while(begin != b && isalpha(begin[-1]))
			--begin;
		if(begin != i && !not_url_char(i[sep.size()]))
			//i[sep.size()] = *(i+sep.size())
			return begin; 
		}
		i+=sep.size();
	}
	return e;
}

bool not_url_char(char c){
	static const string url_ch = "~;/?:@=&$-_.+!*'(),";
	
	// find(url_ch.begin(),url_ch.end(),c)表示在url_ch里查找c字符,
	//如果找到了则返回此时的迭代器,找不到就返回url_ch.end() 
	return !(isalnum(c) || 	find(url_ch.begin(),url_ch.end(),c) != url_ch.end()); 
} 

string::const_iterator 
url_end(string::const_iterator b,string::const_iterator e){
	//find_if的返回类型为迭代器类型,所以函数的返回类型应该也是迭代器类型 
	return find_if(b,e,not_url_char);
	//执行完后返回的迭代器指向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_begin(b,e);
	  	if(b!=e){
	  		iter after = url_end(b,e);
	  		ret.push_back(string(b,after));
	  		b = after;
	  	}
	  } 
	  return ret;
}

最后就是头文件

#ifndef GUARD_find_urls_h
#define GUARD_find_urls_h

#include <string.h>

#include <vector.h>

using std::string;	using std::vector;

string::const_iterator
url_begin(string::const_iterator ,string::const_iterator);
bool not_url_char(char);
string::const_iterator 
url_end(string::const_iterator ,string::const_iterator);
vector<string> find_urls(const string&);

#endif

关于头文件,我看书上说头文件里最好不要用using,但我还是偷懒用了,编译居然通过了...em...好吧,暂时不知道会有什么副作用。

下面跑个例子来看看:


发现这个算法其实有个bug,就是http前面是字母或者符合url_char的字符,那么也会被程序查找进url中,这个我下次改改看。

Accelerated C++英文版及源代码

  • 2009年03月31日 14:05
  • 1.1MB
  • 下载

学习C++,第一本书《Accelerated C++》 总结

关于这个不太成功的计划的一个总结,一直没写总结,主要是因为完成情况不好,原本计划在两周内完成,结果直到这学期的第三周才完成。记得开始这个计划的第一周好像并没有什么任务,做得好像也还可以,但是后来就有了...
  • meisen1124
  • meisen1124
  • 2015-04-13 16:12:17
  • 1217

accelerated C++英文版

  • 2015年05月20日 13:56
  • 1.68MB
  • 下载

C++ Primer太厚了。如果你以前有基础,看Accelerated C++,没基础的话,看Essential C++。C++ Primer当你拿到书的时候,就不想看了。女孩子的话,拿都拿不动。

C++ Primer太厚了。如果你以前有基础,看Accelerated C++,没基础的话,看Essential C++。C++ Primer当你拿到书的时候,就不想看了。女孩子的话,拿都拿不动。 ...
  • aquanga
  • aquanga
  • 2011-08-29 00:27:58
  • 13758

Accelerated C++ 中文英文两版高清

  • 2012年03月30日 08:56
  • 11.83MB
  • 下载

accelerated c++ 课后习题答案:原书作者提供代码

  • 2015年05月28日 17:37
  • 266KB
  • 下载

Accelerated C++ 习题答案

1. 在google的groups,也就是http://groups.google.com里发现很多人在讨论这本书中个别题的答案.如果你想要某一道题的答案,就在那搜Accelerated C++ ex...
  • xp5xp6
  • xp5xp6
  • 2016-01-17 13:09:05
  • 1077

Accelerated C++ 英文版

  • 2011年05月06日 15:49
  • 872KB
  • 下载

Accelerated C++中文pdf版_英文pdf版_源码

  • 2009年09月23日 11:18
  • 11.21MB
  • 下载

Accelerated C++ 6.1查找URL

作为字符串处理的实例,编写一个查找URL的函数。URL格式:  protocol-name://resource-name// 查找 URL#include #include #include #in...
  • wesweeky
  • wesweeky
  • 2011-06-21 21:56:00
  • 585
收藏助手
不良信息举报
您举报文章:Accelerated C++ chapter 06查找URL
举报原因:
原因补充:

(最多只允许输入30个字)