strings zusammensetzen



  • hu
    also ich hab da ein kleines problem,
    ich will ne ip adresse aus 4 ints zusammensetzen
    (ok, ich weiß, netzwerk nicht standart c++, aber es geht hier ja nur um das zusammensetzen der strings =))
    also ich hab
    int cell1,cell2,cell3,cell4;
    die haben alle ihre Werte schon zugewiesen bekommen.
    jetzt muss ich daraus ein zeiger auf ein char machen (char *).
    Wie bring ich das am besten hin?
    ich habs schon mit string ipaddr = cell1 + "." ... probiert, aber da kommen nur misteriöse Zeichen raus.
    bin dankbar über jede Hilfe 🙂



  • ich würde dazu sprintf() benutzen.



  • #include <sstream>
    std::ostringstream s;
    s << cell1 << '.' << cell2 << '.' << cell3 '.' << cell4;
    string ipaddr = s.str();
    

    (aber normalerweise gibts dafür in der Netzwerkapi auch Funktionen, ich sag jetzt mal inet_ntoa ...)



  • danke



  • ansonsten kannste auch ohne std einfach itoa nehmen.



  • Und vier zusammengörige int schreien nach einem Array.
    Lässt sich der string auch schöner füllen.



  • Und vier zusammengörige int schreien nach einem Array.

    Naja, eigentlich ned 🙂
    es sind 4 Bytes ... (unsigend char 0..255) das gibtzusammen einen int (bei 32 bit BS) oder noch besser nen long.

    Interne API funktionen nutzen auch meist den 32 bit wert als Adresse ...

    Das schreit nach ner Union ! oder, da wir hier im C++ sind, nach ner Wrapperklasse !
    sowas in der Art :

    class IPV4AdressWRapper
    {
    	public:
    	// paar Constructoren die mir auf Anhieb einfallen 
    	IPV4AdressWRapper();
    	IPV4AdressWRapper(unsigned char const cell1,unsigned char const cell2,unsigned char const cell3,unsigned char const cell4);
    	IPV4AdressWRapper(unsigend long adress);
    	IPV4AdressWRapper(IPV4AdressWRapper const & rx);
    	// Destructor, braucht man ned unbedingt 
    	~IPV4AdressWRapper();
    
    	// Paar operatoren 
    	bool operator == (IPV4AdressWRapper const & rx) const;
    	bool operator < (IPV4AdressWRapper const & rx) const;
    	bool operator > (IPV4AdressWRapper const & rx) const;
    
    	IPV4AdressWRapper const & operator = (IPV4AdressWRapper const & rx);
    	IPV4AdressWRapper const & operator = (unsigend long adress );
    
    	// Typumwandlung ... wenn mans braucht ... 
    	operator unsigned long () const;
    
    	// und Zugriff auf die einzelnen Zellen 
    	unsigned char getCell1() const;
    	unsigned char getCell2() const;
    	unsigned char getCell3() const;
    	unsigned char getCell4() const;
    
    	void setCell1(unsigned char value);
    	void setCell2(unsigned char value);
    	void setCell3(unsigned char value);
    	void setCell4(unsigned char value);
    
    	// oder viellecht doch besser den [] operator uebeladen, das man wie mit nem Array mit arbeiten kann 
    	unsigned char & operator [] (size_t const index);
    	unsigned char const & operator [](size_t const index) const;
    
    	// und der Clou, ne Funktion die mir gleich den String Erzeugt ... 
    	// laesst sich streiten was man bevorzugt, Strings oder char * :-)
    	int ntoa(std::string & mystring) const;
    	int ntoa(char * str_buffer,size_t const buffer_length) const;
    
    	private:
    	unsigend long m_address;
    }
    

    viel spass beim implementieren ... nur ne Anregung ...

    Naja, IP nummern verwalten ist ned unbedingt ne einmalige angelegenheit ... in Irgend einer Bibliothek zum TCP/IP Protokoll wirds sowas schon geben ...

    Ciao ...



  • Hi,

    also ich wuerde lediglich den 32Bit-Binaerwert und/oder den Praesentationswert
    einer IP-Adresse abspeichern.

    Umwandeln ist dann kein Problem mehr.

    mfg
    v R



  • Eine Klasse für vier Integerwerte ?
    Macht absolut keinen Sinn weil viel zuviel Aufwand ...



  • Kommt drauf an, wieviel man damit arbeiten will.



  • aber die klasse sollte man wenn dann gleich ipv6 konform machen.



  • PeterTheMaster schrieb:

    aber die klasse sollte man wenn dann gleich ipv6 konform machen.

    Ich sag ja, 32Bit-Binaerwert und/oder Praesentations-Schreibweise speichern.

    mfg
    v R

    [nachtrag]
    sehe grad, dass du den 32bit-binaerwert speicherst, warum dann noch sowas
    wie 'Cell1', 'Cell2'?

    Viel zu umstaendlich und einzelne 'Cells' nuetzen dir eh nichts
    [/nachtrag]



  • Ob umstaendlich oder nich, kommt drauf an, wie oft man es braucht.
    Ne klasse fuer nen 32 bit Int ist natuerlich ned sinvoll ... aber schau Dir das Umfeld an, was hast wenn mit der IP adresse arbeitest ... so ganz ohne isses auch ned.
    Um die auf mehrere Plattformen laufen lassen zu koennen, musst noch auf bitwertigkeiten achten.

    Cell1 usw. macht sinn, wenn man den user editierbar die Adresse in Zellenform anbieten will. Wirst ja nich verlangen, das der Nutzer ne IP adresse in 32 bit binaerschreibweise eingibt 🙂

    Dachte eigentlich das irgendwo in ner Lib sone Klasse schon gibt ... und so lange dauerts auch ned, das zu implementieren. Dann hat man bis IPv6 erst mal ruhe. Und die meisten funktionen musst in deiner App soweiso implementieren, wenn nicht ne Klasse dafuer schon findest.

    IPv4 und IPv6 in einer Klasse .. naja, da ist der Aufwand bisser groesser ... und man muss wahrscheinlich mit ner Compiler-Directive arbeiten ? Gibts sowas, wo die Net API's dann statt IPv4 , ne IPv6 Adresse akzeptieren ?

    Ciao



  • Cell1 usw. macht sinn, wenn man den user editierbar die Adresse in Zellenform
    anbieten will. Wirst ja nich verlangen, das der Nutzer ne IP adresse in 32 bit
    binaerschreibweise eingibt 🙂

    Es macht imho keinen Sinn. Wenn der User eine IP eingeben soll, gibt er sie als
    Zeichenkette ein und du nutzt die entsprechenden Funktionen um daraus den
    32Bit-Binaerwert zu erzeugen (den du letztlich in der Klasse speicherst).

    Hast du den 32Bit-Binaerwert aber schon, kannst du auch ohne Probleme daraus
    die Praesentationsschreibweise erzeugen.(Siehe dazu inet_ntop bzw. inet_pton,
    die IPv4 als auch IPv6 korrekt handhaben)

    Also ich sehe den Sinn nicht wirklich in der Geschichte mit den Cells. Aber ich
    lasse mich eines besseren belehren

    mfg
    v R



  • Eine Klasse für vier Integerwerte ?
    Macht absolut keinen Sinn weil viel zuviel Aufwand ...

    Hä? Die klasse repräsentiert eine IP-Adresse und beitet Methoden an um mit deise umzugehen. Dabei ist es egal, ob da nur ein einzelner int-Wert oder gigantische sammlung verschiedenster Typen drin sind.

    Also ich sehe den Sinn nicht wirklich in der Geschichte mit den Cells. Aber ich lasse mich eines besseren belehren

    Ich habe keine Ahnung von inet_ntop, usw., aber vielleicht hilft es, wenn man einzelne Zellen editiren will.



  • Naja, ich wuerde zur eingabe schon Vorgefertigte Cedit Wrapper verwenden, die Dir eingaben nur von 0 .. 255 zulassen. Da ists imho einfacher den Wert ueber die Zells zu modifizieren lassen ... AUsserdem ists dann auch einfacher, weiter Funktionen die die Subnetze betreffen, zu implemntieren ... , naja, je nachdem wie man es macht.

    Mit dem IP eingabefeld hab ich noch ned so die erfahrungen, ich benutz auch die MFC seltener ... wenn da die Funktionalitaet drinn steckt, brauchst es in der klasse ned ...

    Oder wenn schon nen anderen Edit Feld Wrapper gebaut hat, Der dir genau die IP eingabe baut ... ists der selbe Fall, dann brauchst den auch ned ...

    CIao ...



  • Wie schon gesagt, es geht nur um die Umwandlung in einen string.
    Dafür eine Klasse hier zu bauen ist absoluter Blödsinn, oder wisst ihr was er weiter damit anstellen will.
    Ne Klasse muß man da wohl individuell erstellen.



  • Du magst Klassen nicht ? 🙂

    Neee im ernst ...
    Die umwandlungsfunktion von string zu long und andersrum wo wuerdest die hin bauen ?
    Angenommen, es waer nen win32 Programm in C++ ...




    Punkt 3 koennt ich mit leben ... bist aber an ne GUI gebunden, wenn ne IP auch als Programparameter bekommst musst was anderes einfallen lassen ... Den Wrapper kannst dafuer immer gut weiterverwenden ....

    Naja, und ich wuerds halt an die IP (long) selber haengen, weils vom Kontext da halt ned soo falsch ist ... und der mehraufwand eigentlich trivial ...
    Und einmal erledigt, hast nie wieder Sorgen mit ...
    Und irgendwie versteh ich OOP in der art, das man Funktionlalitaeten da dranhaengt, wo sie auch hingehoeren ...
    Fuer viele ists halt nur zusaetzlicher aufwand ....

    Ich mach es eigentlich recht oft, das ich zum besipiel einzelne Strings in nen Wrapperklasse packe, um dazugehoerige Funktionen dann da dran zu haengen. Findet man dann auch recht schnell.
    Zum Beispiel BaumString , der nen String ind der Form "Knoten1\\Knoten2\\Knoten3" in nen vector parst und die Hirachiestufe ausgibt ... etc ...

    Ciao ...



  • natürlich sind Klassen Klasse. 😃
    Nur man kann hier nicht irgendeine Klasse bauen, wenn man gar nicht weiss, was
    das Programm letztendlich machen soll.
    Vielleicht will er die string IP ja nur in irgendeiner Datei speichern.
    Für sowas würde ich niemals anfangen eine Klasse zu generieren.
    Wenn man ihm hier irgendwelche Fantasieklassen hinlegt, dann ist das wohl nicht mehr realistisch.
    Ich denke seine eigentliche Frage wurde schon längst beantwortet und es bringt
    nicht hier herumzuphilosophieren.


Anmelden zum Antworten