Hi all. This regards chapter 6 of "Accelerated C++".
The program is intended to scan a document and find all the urls in it.
I am testing it with just one string input "text http://www.page.com more text".
The program is compiling but doesn't run beyond me entering the input.
I can't see what the problem is.
Any help would be, as always, much appreciated.
Thanks.
URL_Searcher_Main.cpp:
#include "find_urls.h"
#include <iostream>
#include <string>
#include <vector>
using std::cout; using std::cin; using std::endl;
using std::string; using std::vector;
int main()
{
string s;
getline(cin, s);
vector<string> urls = find_urls(s);
for(vector<string>::const_iterator iter = urls.begin(); iter != urls.end(); ++iter)
cout << *iter << endl;
return 0;
}
find_urls.cpp:
#include "find_urls.h"
#include "url_beg.h"
#include "url_end.h"
using std::string; using std::vector;
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);
if (b != e)
{
iter after = url_end(b, e);
ret.push_back(string(b, after));
b = after;
}
}
return ret;
}
url_beg.cpp:
#include "url_beg.h"
#include "not_url_char.h"
#include <algorithm>
using std::search; using std::string;
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;
while ((i = search(i, e, sep.begin(), sep.end())) != e)
{
if (i != b && i + sep.size() != e)
{
iter beg = i;
while (beg != b && isalpha(beg[-1]))
--beg;
if (beg != i && !not_url_char(i[sep.size()]))
return beg;
}
i += sep.size();
}
return e;
}
url_end.cpp:
#include "url_end.h"
#include "not_url_char.h"
#include <algorithm>
using std::find_if; using std::string;
string::const_iterator url_end(string::const_iterator b, string::const_iterator e)
{
return find_if(b, e, not_url_char);
}
not_url_char.cpp:
#include "not_url_char.h"
#include <algorithm>
#include <cctype>
#include <string>
using std::isalnum; using std::string;
bool not_url_char(char c)
{
static const string url_ch = "~;/?@=&$-_.+!*'(),";
return !(isalnum(c) || find(url_ch.begin(), url_ch.end(), c) != url_ch.end());
}