String auslesen und Zeichen ergänzen
-
Moin,
wie kann man Folgendes realisieren:
Ich lese aus einer Datei Telefonnr. aus, diese werden in strings gespeichert.
string number = "+49 1231234123"Leider entspricht das Format nicht der DIN-Norm. Jetzt möchte ich den string verändendern, sodass am Schluss folgendes Ergebnis herauskommt.
string number = "+49 (0)123 1234-123"Ist es möglich einen string von links nach rachts, zeichenweise auszulesen. Also nach dem 4ten Zeichen soll "(0)" eingefügt werden, nach dem 7ten Zeichen " " und nach dem 11ten Zeichen "-".
MfG Domi
-
Ja, einen string kannst du genauso benutzen als wäre er ein vector<char>. Das heißt du kannst mit den bekannten Techniken iterieren, gezielt zugreifen und einfügen. Zudem bietet die Stringklasse natürlich noch zahlreiche Methoden die speziell auf Zeichenkettenmanipulation ausgelegt sind, näheres in der Doku zu der Klasse (z.B. hier).
Aber das weißt du sicherlich schon. Das Problem ist wohl eher, die Umwandlung deiner Telefonnummer als Algorithmus allgemein zu formulieren.
Also nach dem 4ten Zeichen soll "(0)" eingefügt werden, nach dem 7ten Zeichen " " und nach dem 11ten Zeichen "-".
Das ist zwar sehr einfach, aber das gilt doch wohl nicht für alle Telefonnummern, sondern nur für dein Beispiel.
-
Danke für die schnelle Antwort.
Die Telefonnr. die ich auslese sind immer genau so aufgebaut wie in meinem Beispiel.
#include <iostream> #include <string> using namespace std; int main(){ string number = "+49 1231234123"; cout << number << endl; number.insert(11, "-"); number.insert(7, " "); number.insert(4, "(0)"); cout << number << endl; return 0; }Habe das jetzt mal so gelöst.
-
Worauf SeppJ sicher hinaus wollte ist, dass Vorwahlen nicht immer die gleiche Stellenanzahl haben. Auch ist die Stellenanzahl der eigentlichen Nummer nicht immer identisch. Das selbe gilt für die Durchwahl, die auch schon mal gar nicht vorhanden sein kann. Es wird sicher schwierig sein, für dieses Problem überhaupt eine saubere Lösung zu finden.
-
Ja es könnte zum Problem werden, aber wirklich nicht in meinem Fall. Bin jetzt die Liste, die ich auslesen muss, nochmals durchgegangen. Alle Nr. sind so geglieder "+49 (vorwahl) (nr)(durchwahl)". Die Vorwahl und die Nr bleiben immer gleich. Nur die Druchwahl ist immer verschieden, aber auch immer nur 3-stellig.
-
Braucht nur noch jemand ein Leerzeichen zuviel/zuwenig machen und dein Programm funktioniert nicht mehr...
-
HighLigerBiMBam schrieb:
Braucht nur noch jemand ein Leerzeichen zuviel/zuwenig machen und dein Programm funktioniert nicht mehr...
Gebe ich dir vollkommen Recht. Die Liste aus der ich diese Daten auswerte, wird sauber gepflegt. Leider fehlt mir noch die Erfahrung um eventuelle Fehleingaben zu automatisch zu korrigieren.
-
Evtl. std::regex/boost::regex?
-
#include <cctype> string number = "+49 12 31 234 123 "; for(size_t i = 0; i < number.length(); ++i) if(isspace(number[i])) number.erase(i--, 1);
-
Hallo Domi,
ich würde das im Prinzip so ähnlich machen, wie schon als Lösungsvorschlag auf Deine letzte Anfrage beschrieben.
Fasse 'Telefonnummer' in eine Struktur. Das hat zunächst einmal den Vorteil, dass Du sie von std::string unterscheiden kannst. Insbesondere wenn man jetzt eine Funktion schreiben kann, die (im allereinfachsten Fall) so aussehen kann:
#include <iostream> #include <fstream> #include <string> // -- Eine Telefonnummer struct Telefonnummer { std::string laendereinwahl; std::string nummer; }; // -- diese Funktion liest die Telefonnummer std::istream& lese_ein( std::istream& in, Telefonnummer& p ) { in >> p.laendereinwahl; in >> p.nummer; return in; }Das funktioniert genau dann, wenn die Telefonnummer z.B.: so "+49 1233445678" geschrieben sind.
Anschließend schreibst Du noch eine Funktion, die die Telefonnummer auch wieder ausgibt. Also z.B.:
// -- diese Funktion gibt die Telefonnummer aus std::ostream& schreibe( std::ostream& out, const Telefonnummer& tn ) { out << tn.laendereinwahl << " (0) " << tn.nummer; // hier jetzt das gewünschte '(0)' einfügen return out; }.. ja und der Rest sollte Dir bekannt vorkommen.
int main() { using namespace std; ifstream datei( "telefonnummern.txt" ); if(!datei.is_open()) cerr << "Fehler beim Oeffnen der Datei!" << endl; else { for( Telefonnummer tel; lese_ein( datei, tel ); ) { schreibe( cout, tel ) << endl; } } return 0; }Sollte die Telefonnummer nicht so einfach oder einheitlich formatiert sein, so kann man das in 'lese_ein' lösen. Da ist natürlich einiges möglich.
Genauso hast Du die Möglichkeit die Ausgabe zu verfeinern bzw. Deinen Wünschen anzupassen - in 'schreibe'.
Das eigentliche Programm, welches beides nutzt, bleibt davon unbehelligt.Gruß
Werner