Stroustrup hat kürzlich eine Reihe von Posts veröffentlicht, in denen beliebte Mythen über C ++ entlarvt werden . Der fünfte Mythos lautet: „C ++ ist nur für große, komplizierte Programme“. Um es zu entlarven, schrieb er ein einfaches C ++ - Programm, das eine Webseite herunterlud und Links daraus extrahierte . Hier ist es:
#include <string>
#include <set>
#include <iostream>
#include <sstream>
#include <regex>
#include <boost/asio.hpp>
using namespace std;
set<string> get_strings(istream& is, regex pat)
{
set<string> res;
smatch m;
for (string s; getline(is, s);) // read a line
if (regex_search(s, m, pat))
res.insert(m[0]); // save match in set
return res;
}
void connect_to_file(iostream& s, const string& server, const string& file)
// open a connection to server and open an attach file to s
// skip headers
{
if (!s)
throw runtime_error{ "can't connect\n" };
// Request to read the file from the server:
s << "GET " << "http://" + server + "/" + file << " HTTP/1.0\r\n";
s << "Host: " << server << "\r\n";
s << "Accept: */*\r\n";
s << "Connection: close\r\n\r\n";
// Check that the response is OK:
string http_version;
unsigned int status_code;
s >> http_version >> status_code;
string status_message;
getline(s, status_message);
if (!s || http_version.substr(0, 5) != "HTTP/")
throw runtime_error{ "Invalid response\n" };
if (status_code != 200)
throw runtime_error{ "Response returned with status code" };
// Discard the response headers, which are terminated by a blank line:
string header;
while (getline(s, header) && header != "\r")
;
}
int main()
{
try {
string server = "www.stroustrup.com";
boost::asio::ip::tcp::iostream s{ server, "http" }; // make a connection
connect_to_file(s, server, "C++.html"); // check and open file
regex pat{ R"((http://)?www([./#\+-]\w*)+)" }; // URL
for (auto x : get_strings(s, pat)) // look for URLs
cout << x << '\n';
}
catch (std::exception& e) {
std::cout << "Exception: " << e.what() << "\n";
return 1;
}
}
Zeigen wir Stroustrup, was für ein kleines und lesbares Programm das ist.
- Herunterladen
http://www.stroustrup.com/C++.html
Alle Links auflisten:
http://www-h.eng.cam.ac.uk/help/tpl/languages/C++.html http://www.accu.org http://www.artima.co/cppsource http://www.boost.org ...
Sie können eine beliebige Sprache verwenden, Bibliotheken von Drittanbietern sind jedoch nicht zulässig.
Gewinner
Die C ++ - Antwort, die durch Stimmen gewonnen wurde, basiert auf einer Bibliothek eines halben Drittanbieters (die von den Regeln nicht zugelassen ist) und zusammen mit einem anderen engen Konkurrenten, Bash , auf einem gemeinsam gehackten HTTP-Client (dies funktioniert nicht mit HTTPS). gzip, Weiterleitungen usw.). Damit ist Wolfram ein klarer Sieger. Eine andere Lösung, die in Bezug auf Größe und Lesbarkeit sehr nahe kommt, ist PowerShell (mit Verbesserungen gegenüber Kommentaren), die jedoch nicht viel Aufmerksamkeit erhalten hat. Mainstream-Sprachen ( Python , C # ) kamen auch ziemlich nahe.
Content-Type: text/html; charset=UTF-8
... Ich werde ihm eine E-Mail schicken.
boost/asio
es aufgebraucht ist , was ist eine Drittanbieter - Bibliothek. Ich meine, wie werden Sprachen, die URL / TCP-Abruf als Teil ihrer Standardbibliothek nicht enthalten, konkurrieren?