Email einlesen
-
Boaa danke euch für die antworten, werde mal deine lösung verwenden @just a joke

-
Ich möchte noch einen Vorschlag hinzufügen, der den selben Job erledigt. Er ist ein bisschen mehr C++ und etwas weniger C-Style und verhält sich ein wenig robuster gegenüber Nutzereingaben (in denen z.B. das '@' fehlt):
string in; ... // Eingabe ... char at = '@'; auto i = cbegin(in); for (; i != cend(in) && *i != at; ++i); string name(cbegin(in), i); string email(i != cend(in) ? i + 1 : i, cend(in)); ... // AusgabeBemerkung: Der Code prüft die vermeintliche E-Mail-Adresse natürlich nicht auf Plausibilität, sondern schnippelt das Ding lediglich beim ersten '@' in zwei Teile (denke das ist klar, oder?). Sauberer und robuster geht es natürlich mit
std::regexoderboost::regex(wie von hardware vorgeschlagen) wenn ersteres nicht verfügbar ist. Damit kann man relativ einfach ein wenig genauer prüfen, ob auch alle Regeln für E-Mail-Adressen eingehalten werden (nur ein '@', nicht-leerer Username, Domainname und TLD, etc.)just a joke schrieb:
in[i] = '\0'; name = &(in[0]); email = &(in[i+1]);finde dieses ganze string rumkopieren für solche aufgaben ein wenig übertrieben....
Gerade bei solchen Aufgaben, wo es wenig auf Performance ankommt, sollte man den String vielleicht besser doch kopieren anstatt zwei Nullterminierte C-Strings in den internen Speicher eines std::string hineinzufrickeln :p Für diesen speziellen Code funktioniert das zwar, aber nicht unbedingt sehr lange, wenn das Programm größer und etwas komplexer wird. Irgendwann muss man die Substrings dann sowieso kopieren - spätestens wenn sie an anderer Stelle gespeichert werden sollen, bzw. wenn man sie aus einer Funktion zurückgibt.
Finnegan
-
just a joke schrieb:
in[i] = '\0';
name = &(in[0]);
email = &(in[i+1]);Bei so einem Krampf kann ich natürlich verstehen, daß du nur mit Pseudonym auftrittst.
-
danke für die ganzen posts erstmal

@ Finnegan
mhhh naja, ich bin noch ein neuling was c++ angeht und deswegen weiß ich nicht was cbegin oder cend machen^^

das war bei uns an der FH nur eine kleine zwischentestat aufgabe, die in einer stunde erledigt sein müsste(die meisten waren nach 10 minuten eh fertig ^^)
Naja anspruchsvoll war die jetzt nicht, aber ich wusste halt nur nicht wie ich meinen string "email" die domäne nach dem @ zeichen übergebe

MfG
-
Musti91 schrieb:
danke für die ganzen posts erstmal

@ Finnegan
mhhh naja, ich bin noch ein neuling was c++ angeht und deswegen weiß ich nicht was cbegin oder cend machen^^

das war bei uns an der FH nur eine kleine zwischentestat aufgabe, die in einer stunde erledigt sein müsste(die meisten waren nach 10 minuten eh fertig ^^)
Naja anspruchsvoll war die jetzt nicht, aber ich wusste halt nur nicht wie ich meinen string "email" die domäne nach dem @ zeichen übergebe

MfG
Es war nicht meine Absicht dich zu schockieren. Das was ich da geschrieben habe ist ein Iterator-basierter Ansatz, wie er auch von vielen Algorithmen der Standardbibliothek verwendet wird (wie z.B.
std::sortoderstd::binary_search). Damit lassen sich relativ bequem direkte Zugriffe auf Container (wiestd::string,std::vector, etc.) wegabstrahieren indem man die Folge von Elementen (char-Werte in diesem Fall), die man mit dem Algorithmus verarbeiten will, als Bereich auffasst der durch ein Anfangselement und ein Endelement definiert ist (cbegingibt dir einen konstanten Iterator auf das erste Element des Containers, undcendverweist auf eine Position hinter das letzte Element).Für einen String kann man diese Iteratoren auch als konstante
char*auffassen (unter der Haube sind sie auch nichts anderes).
Dieser Ansatz ist insofern etwas flexibler, als dass man damit den Algorithmus auf nahezu beliebigen Containern laufen lassen kann (std::string in diesem Fall, aber die Zeichen könnten auch in einem std::vector oder in einer verketteten Liste stehen).Man bei kann natürlich auch mit einem Integer-Index arbeiten, allerdings werden für veralgemeinerte Algorithmen gerne Iteratoren verwendet, da diese wesentlich flexibler sind. Flexibler, nicht nur weil man auch andere Container verwenden kann, sondern z.B. den obigen E-Mail-Splitter auch nur auf einem Teilstring laufen lassen kann - wenn man z.B. eine komplette E-Mail-Nachricht verarbeitet und daraus z.B. die Empfängeradressen herausziehen möchte.
Für dein Zwischentestat, bei dem man nicht so viel Zeit investieren möchte reicht sicherlich auch erst einmal die grobschlächtige Lösung, allerdings empfiehlt es sich nicht, sich sowas anzugewöhnen, wenn man irgendwann mal wirklich produktiv mit C++ an einem größeren Projekt arbeiten möchte. Besonders diese
email = &(in[i+1]);betteln geradezu darum einem irgendwann mal gehörig auf die Füße zu fallen
Finnegan
-
Check mal std::regex und dann suche dir einen entsprechenden regulären Ausdruck von http://stackoverflow.com/....
-
Das ist doch viel zu kompliziert - hier geht es nur um das Extrahieren von Teilstrings und da ist meine erste Antwort immer noch die beste.
Hier noch mal mit Link: string::find und string::substr
-
Die Schönheit liegt im Auge des Betrachters

-
Die klassische Antwort: Direkt richtig einlesen.
#include <iostream> #include <string> using namespace std; int main() { string name = "", email = ""; char at = '@'; cout << "Geben Sie ihre email-adresse ein: "; getline(cin, name, at); // bis @ einlesen und @ entfernen getline(cin, email); // Domain einlesen cout <<"Ihr Name lautet : " << name << endl; cout << "Ihre Email-Domain lautet : " << email << endl << endl; system("pause"); return 0; }BTW: Der Defaultkonstruktor von string initialisiert ihn semantisch zu einem leeren String, das = "" kannst du dir also sparen. endl ist nicht ganz dasselbe wie '\n', system("pause") ist nicht portabel und das return 0 ist in der (und nur in der) main überflüssig, weil implizit.
-
goran schrieb:
Die Schönheit liegt im Auge des Betrachters

Nein.