2016-05-02 13 views
-3

ich eine Date Klasse mache, die einen string als Parameter annimmt, die wie ist:welche Funktion soll ich für Split verwenden, um die Zeichenfolge

11/13/2007 
9/23/2008 
9/23/2008

... und legen Sie es Monat, Datum und Jahr Objekte, Wie kann ich die substr() Funktion verwenden, oder gibt es noch andere Funktionen?

+5

ist, wie Sie es tun können: Zum Visual Studio, Erstellen Sie ein neues Projekt (bevorzugen leeres Projekt), '# include' gewünschten Bibliotheken und Programmieren beginnen. Suche weiter und versuche, bis es funktioniert. Wenn Sie irgendwo mit einem klaren Fehler scheitern, dann kommen Sie hier und wir werden mehr als glücklich sein, Ihnen zu helfen. –

+2

Haben Sie schon einmal etwas versucht? Es gibt unzählige Beispiele auf dieser Seite und im Internet, denen Sie folgen können. Fall in Punkt: http://stackoverflow.com/questions/236129/split-a-string-in-c – NathanOliver

+0

Ich habe dies bereits getan. Aber ich kann nicht alles in diesem metod tun, ich weiß, wie substr() funktioniert, dauert es nur dort, wo sie anfangen soll und wie viele Index sollte es gehen – pflove

Antwort

2

In Ihrem Fall würde ich die gute alte C verwendet sscanf Funktion (!):

unsigned int year, month, day; 
char c; 
if(sscanf(input, "%u/%u/%u%c", &month, &day, &year, &c) == 3) 
{ 
    // check ranges of your date variables! 
} 

Sie scheinen amerikanisches Datumsformat zu verwenden, so dass ich die Parameter passend gesetzt.

Sie fragen sich, warum ich ein zusätzliches Zeichen zu lesen? Es fängt zusätzliche Daten am Ende Ihrer Datumszeichenfolge auf, um ungültige Formate zu erkennen (wenn die Daten folgen, wird das Ergebnis 4 sein, andernfalls werden nur 3 Werte gelesen, die zurückgegeben werden). Ein Nachteil: Vor den drei Zahlen wird Leerzeichen ignoriert. Wenn Sie also nicht zulassen möchten, benötigen Sie zusätzliche Prüfungen (z. B. "%n %n%u" und vergleichen, ob die beiden entsprechenden Werte gleich sind).

Siehe sscanf Dokumentation (scanf für Parameter).

(Wenn Sie Ihre Eingabe eine ::std::string Instanz ist, müssen Sie sscanf(input.c_str(), ...), natürlich verwenden.)

+0

das ist eine ziemlich gute Technik für diesen speziellen Fall. @pflove, versuche dies zu benutzen. –

+0

Nur ein Zusatz: Sie erhalten das Datum bereits in numerische Daten umgewandelt! Ich nahm an, dass dies erwünscht ist, da die Frage mit string- * parsing * markiert ist. Wenn nicht, siehe Michelfrancis Kommentar zu der Frage. – Aconcagua

+0

Pinpoint! Das wird mir so viel helfen, danke! – pflove

1

Wenn Sie C 11 ++ verwenden Sie <regex> Bibliothek verwenden können:

#include <iostream> 
#include <regex> 
#include <string> 

int main() { 
    std::string date = "1/1/1970"; 
    std::regex dateRegex("(\\d\\d?)/(\\d\\d?)/(\\d{4})"); 
    std::smatch match; 
    if (regex_match(date, match, dateRegex)) { 
     std::cout << match.str(1) << std::endl; 
     std::cout << match.str(2) << std::endl; 
     std::cout << match.str(3) << std::endl; 
    } 
    else { 
     // error 
    } 
    return 0; 
} 

Dies ist Vielleicht ein Overkill für Ihre Situation, aber denken Sie daran, dass Sie mit dem regulären Ausdruck auch eine Form der Validierung Ihrer Eingabe durchführen. Wenn Sie im obigen Beispiel etwas übergeben, das nicht die Form dd/dd/dddd hat, wobei "d" eine Ziffer ist, geben Sie den Codeblock "error" ein. Natürlich wird 99/99/9999 als gültige Eingabe gezählt, aber Sie können diesen Fall auch mit komplizierterer Regex lösen.

Eine weitere Option für Strings mit Begrenzer Parsen verwendet getline Funktion. Hier

Verwandte Themen