Strings manipulieren
-
Hallo,
ich habe ein kleines String Problem und zwar habe ich vor die letzten Zahl einer Ip-Adresse abzuschneiden und dann durch eine andere Zahl zu erstzen.Habe schon die verschiedensten Funktionen genommen aber es steht immer noch anderer Müll in der Variablen.
char ip[16]= "192.168.1.1"; char ip_last[16]; int last_segmet = 150; //Ergebnis soll sein // ip_last = 192.168.1.150;
P.S weiß einer wie ich Reguläre Ausdrücke unter C benutze?
-
Hallo,
C bietet kein natives Interface für reguläre ausdrücke, dafür gibt es entsprechende bibleotheken. Hängt natürlich davon ab welches OS du benutzt. Die GNU regex-lib ist da ganz gut. Aber ich denke dein Problem lässt sich auch anders lösen
Dein algorithmus für das Ersetzen kann folgendermaßen aussehen.
-
prüfe Länge der Gegebenen IP-Addresse
-
finde den letzten Punkt '.' in diesem Puffer
-
Subtrahiere die Position des Punktes von Gesamtlänge (Nun kennst du die länge der Addresse ohne die letzte Zahl)
-
Allociere Speicher mit Differenz aus vorheriger Operation + länge deiner Zahl + '\0'
-
Schreibe deine Zahl zeichenweise hinter den Punkt.
So das war der komplizierte Weg.
Einfacher gehts aber auch.
Behandle die IP-Addresse als Zahl (benutze Bibleotheksfunktion zum Umwandeln von char * in unsigned long). Setze mittels Bitoperatoren das letze octet und wandle die Zahl wieder in einen char *. (Wieder Bibleotheksfunktion)[Edit] Mit Bibleotheksfunktion mein ich ne umwandlung von ner dottet-darstellung in unsigned long [/Edit]
-
-
habs nicht gross getestet und um AJ und Shade zuvorzukommen... ja ich schreib das nachher nochmal schön mit ansprechenden variablennamen
void replace_ip_part(int part,char* number,char ip[16]){ char *p,*q; for(p=ip;*p&∂++p)if(*p=='.')--part; for(q=p;*q;++q)if(*q=='.')break; memmove(q+strlen(number)-(q-p),q,strlen(q) ); for(q=number;*q;*p++=*q++); } int main(){ char ip[16]= "192.168.70.1"; printf("%s\n",ip); replace_ip_part(0,"255",ip); printf("%s\n",ip); replace_ip_part(1,"255",ip); printf("%s\n",ip); replace_ip_part(2,"255",ip); printf("%s\n",ip); replace_ip_part(3,"255",ip); printf("%s\n",ip); }
-
Wie kann ich ein int-Zahl wieder in einen String umwandeln?
int x=123; char[4] = 123; //?
;
-
sprintf
-
Hallo,
ich befürchte du hast mich falsch verstanden. Ich meinte mit umwandlung von char * in unsigned long die Umwandlungder der IP-Addresse der form "255.255.255.255" in einen unsigned long wert. In diesem fall wäre das 0xffffffff. Für den umgekehrten weg gilt das selbe. Ich glaube nahezu jede socketbibleothek bietetunsigned long inet_addr(const char*);
an.
Die Umkehrung wäre dann
char *inet_ntoa(struct in_addr in);
Guck am besten in der Doku für deine Socketbibleothek.
-
@prolog
ich mag mich irren aber das ist doch dann kein ansi-c mehr oder?
-
Nein ist es nicht. Wie gesagt werden dann bibleotheken benutzt die nicht standard sind. Ich glaube aber dass es so einfacher zu lösen ist. Natürlich geht deine Lösung auch. Aber da ich vermute dass es sich eh in seinem Fall um code aus einer Netzwerkanwendung handelt, dachte ich er kann auch gleich die Funktionen benutzen.
-
@prolog
jo deine lösung wollte ich auch erst vorschlagen aber ich dachte dann fallen hier sämtliche standardgläubige über mich her... mein lösung gefällt ihnen vielleicht nicht ist aber nach Ansi-standard
-
Wenns dir hilft kann ich ja als Bibleothekengläubiger über deinen code herfallen.
Nee hast ja recht. Naja soll er sich aussuchen.
-
Ich glaube ich habe euch schon verstanden. Momentan benutze den Algo von Windalf allerdings übergiebt er der Funktion ein char als Austauschwert ich habe allerdings nur einen int-Wert. Und nu muss ich den ja wieder in ein char Wert "casten". Allerdings kommt es dort zu fehlern
beim übergang von 1-2 Ziffern.
-
du solltest ja auch sprintf verwenden...
int zahl=255; char zahl_als_chararray[4]; sprintf(zahl_als_chararray,"%d",zahl);
-
prolog schrieb:
Wenns dir hilft kann ich ja als Bibleothekengläubiger über deinen code herfallen.
Nee hast ja recht. Naja soll er sich aussuchen.
Es heißt Bibliothek!
got Deutsch?
-
Es geht doch vor allem um den letzten IP-Teil.
Wie stehts damit?char ip[16]= "192.168.1.1"; char ip_last[16]; int last_segmet = 150; strcpy(ip_last, ip); sprintf(strrchr(ip_last, '.')+1, "%d", last_segmet);
-
@dumb
Entschuldige vielmals. Muss ich jetz das Wort Bibliothek 100 mal an die Tafel schreiben ?
-
Vielen Dank ersmal!
Ich hatte das genau so mit printf gelöst. Allerdings hat das nicht gefunzt bis ich char ip[1000] auf char ip[4] gestzt hatte??? Ist das vom Prinzip her nicht egal?
Nun funzt aber allles
-
Scheinbar nicht sonst hätte es ja geklappt
-
ups ich hab das gerade mal vernünfitg getestest... ist tatsächlich noch buggy... man muss ggf. das nullbyte am ende noch vernünftig verschieben...
-
@Taurin
Das wäre auch meine Lösung gewesen, da es ja nur hieß, dass die letzte Stelle geändert werden muss. Nur sollte man da noch eine Abfrage einbauen, ob strrchr() auch was gefunden hat. Auf die Speicheradresse 0 bzw. 1 zu schreiben, kommt nicht gut ;).Ansonsten würde ich der Lösung von prolog nachgehen. Die IP-Adresse also zuerst in eine Zahl umwandeln (das geht auch mit ANSI-C @Windalf ;)) davon die gewünschte Stelle entfernen, die neue Zahl einfügen und wieder in das bekannte Stringformat formatieren.
-
es gibt eigentlich eine ganz einfach ANSI-C Lösung
bin leider nicht selber drauf gekommen werd sie euch aber nicht vorenthalten
da hab ich irgendwie erst den wald vor lauter bäumen nicht gesehenvoid replace_ip_part(int part,char*number,char ip[16]){ int a[4]; sscanf(ip,"%d.%d.%d.%d",a,a+1,a+2,a+3); a[part]=atoi(number); sprintf(ip,"%d.%d.%d.%d",*a,a[1],a[2],a[3]); }