2 Stimmen

URLs mit C-Strings in C++ parsen

Ich lerne C++ für eine meiner CS-Klassen, und für unser erstes Projekt muss ich einige URLs mit c-Zeichenfolgen (d.h. ich kann nicht die C++-String-Klasse verwenden) analysieren.

Der einzige Weg, den ich denken kann, um dies zu nähern ist nur durch iterieren (da es ein char[]) und mit einigen Switch-Anweisungen. Von jemandem, der mehr Erfahrung in C++ ist - gibt es einen besseren Ansatz? Könnten Sie mich vielleicht auf eine gute Online-Ressource hinweisen? Ich habe noch keine gefunden.

6voto

hookenz Punkte 33326

Seltsam, dass man keine C++-Spracheigenschaften, d.h. C++-Strings, verwenden darf!

In der Standard-C-Bibliothek sind einige C-String-Funktionen verfügbar.

z.B..

strdup - duplicate a string
strtok - breaking a string into tokens. Beware - this modifies the original string.
strcpy - copying string
strstr - find string in string
strncpy - copy up to n bytes of string
etc

Hier gibt es eine gute Online-Referenz mit einer vollständigen Liste der verfügbaren c-String-Funktionen zum Suchen und Finden von Dingen.

http://www.cplusplus.com/reference/clibrary/cstring/

Sie können durch Strings gehen, indem Sie auf sie wie auf ein Array zugreifen, wenn Sie es brauchen.

z.B..

char* url="http://stackoverflow.com/questions/1370870/c-strings-in-c"
int len = strlen(url);
for (int i = 0; i < len; ++i){
  std::cout << url[i];
}
std::cout << endl;

Wie man das Parsing tatsächlich durchführt, müssen Sie selbst herausfinden. Es handelt sich schließlich um eine Aufgabe.

3 Stimmen

strdup ist nicht in der Standardbibliothek enthalten, sondern wird von POSIX definiert.

0 Stimmen

Wenn er strdup() nicht hat, wäre es ein netter kleiner Teil der Aufgabe, es bereitzustellen. Bootstraps!

5voto

Tyler McHenry Punkte 71707

Es gibt eine Reihe von Funktionen der C-Standardbibliothek, die Ihnen dabei helfen können.

Schauen Sie sich zunächst die Funktion der C-Standardbibliothek an strtok . Damit können Sie Teile einer C-Zeichenkette abrufen, die durch bestimmte Begrenzungszeichen getrennt sind. Beispielsweise können Sie mit dem Trennzeichen / das Protokoll, die Domäne und dann den Dateipfad abrufen. Sie können die Domäne mit dem Begrenzungszeichen . tokenisieren, um die Subdomäne(n), die Domäne zweiter Ebene und die Domäne oberster Ebene zu erhalten. Etc.

Es ist nicht annähernd so leistungsfähig wie ein Parser für reguläre Ausdrücke, was Sie eigentlich für das Parsen von URLs brauchen würden, aber es funktioniert mit C-Strings, ist Teil der C-Standardbibliothek und kann wahrscheinlich in Ihrer Aufgabe verwendet werden.

Andere Funktionen der C-Standardbibliothek, die hilfreich sein können:

  • strstr() Extrahiert Teilstrings genau wie std::string::substr()
  • strspn(), strchr() und strpbrk() Suche nach einem oder mehreren Zeichen in einer Zeichenkette, ähnlich wie bei std::string::find_first_of(), usw.

Bearbeiten: Eine Erinnerung daran, dass die korrekte Art, diese Funktionen in C++ zu verwenden, darin besteht, die <cstring> und verwenden sie im std:: Namensraum, z.B. std::strtok().

0 Stimmen

Strtok ist ziemlich unangenehm, da es die Zeichenkette verändert. Ich bin ein großer Fan von const, also würde ich empfehlen, strtok zu vermeiden.

0 Stimmen

IMO, strtok ist sehr nützlich und viel weniger mühsam als alles von Hand zu kodieren, wenn es darum geht, Strings nur mit der C-Standardbibliothek zu parsen. Aber ja, man muss sich vor seinen Tücken hüten, einschließlich der String-Modifikation und der Nicht-Rentranzität (obwohl POSIX eine re-entrant Version namens strtok_r anbietet)

2voto

Mark Rushakoff Punkte 236626

Vielleicht möchten Sie auf eine Open-Source-Bibliothek verweisen, die URLs analysieren kann (als Referenz dafür, wie andere es gemacht haben - natürlich nicht kopieren und einfügen!), wie z.B. locken. o wget (die Links führen direkt zu den Dateien für die Url-Analyse).

1 Stimmen

Aus irgendeinem Grund bezweifle ich, dass es das ist, wonach sein Ausbilder sucht.

0 Stimmen

@Michael: Ich dachte dasselbe wie Sie, bis mir klar wurde, dass er damit vielleicht meint, dass der Fragesteller die Quelle für Ideen nutzen soll.

1 Stimmen

Na gut... Nun frage ich mich, ob jemand, der die Grundlagen der C-Bibliothek nicht kennt, in der Lage sein wird, seinen Kopf vor dem Zerbersten zu bewahren, wenn er diesen Code liest?

1voto

Peter Mortensen Punkte 29848

Ich weiß nicht, welche Anforderungen an das Parsen der URLs gestellt werden, aber wenn dies CS-Niveau ist, wäre es angemessen, (sehr BNF und einen (sehr einfachen) rekursiven Deszendenzparser zu verwenden.

Dies wäre eine robustere Lösung als die direkte Iteration, z. B. bei fehlerhaften URLs.

Nur sehr wenige String-Funktionen aus der Standard-C-Bibliothek würden benötigt werden.

0voto

Dmitriy Punkte 3205

Sie können C-Funktionen wie strtok, strchr, strstr usw. verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X