Hallo. ich muss in meinem code in einem string nach der 2. stelle von rechts ein Komma einfügen. Wie mach ich sowas am besten ? bis jetzt hab ich es so gemacht: s[strlen(s)+1] = '\0'; s[strlen(s)] = s[strlen(s)-1]; s[strlen(s)-2] = s[strlen(s)-3]; s[strlen(s)-3] = ','; Aber es muss doch eine elegantere / bessere lösung geben !? Und noch ne kleine frage: wie kann ich strings miteinander verknüpfen ? z.B. LCD_SetText("hallo" + "1"); //Das funktioniert leider nicht. oder LCD_SetText(string1 + " " + String2); //geht auch nicht Gruß
Hi,
>Aber es muss doch eine elegantere / bessere lösung geben !?
Eigentlich nicht. Etwas effizienter wird es, wenn Du nur ein Mal
strlen
anwendest:
int i = strlen(s);
s[i+1] = '\0';
s[i] = s[i-1];
s[i-1] = s[i-2];
s[i-2] = ',';
Strings kannst Du mit der Funktion strcat zusammensetzen. Mußte mal in
der string.h - Datei nach dem Prototypen suchen.
Grüße
Oliver
muss ich den speicher den ich (temporär) verwende wieder freigeben ? Oder geschieht das autmatisch am ende einer funktion ? @OlliK: gibt es keine funktion die einfach die 2 bytes eine stelle nach hinten kopiert und die mir die ersten 2 zeichen kopiert ? Bsp: s = copy(s, 1,2) + "," + copymove(s, 3,2, 3); ( copymove(scr, start, length, position) ) ? MfG
>muss ich den speicher den ich (temporär) verwende wieder freigeben ? Von welchem Speicher schreibst Du??? >gibt es keine funktion die einfach die 2 bytes eine stelle nach hinten kopiert und die mir die ersten 2 zeichen kopiert ? Klar gibts die, hier ist se ;-) void KommaMove(char* s) { int i = strlen(s); s[i+1] = '\0'; s[i] = s[i-1]; s[i-1] = s[i-2]; s[i-2] = ','; }
@OlliK: ;) ok, hast gewonnen ! Ich mein wenn ich z.B. in einer funktion die beispielsweise KommaMove heisst eine int variable erstelle. Wird dieser speicher nach dem beenden/rücksprung aus der funktion autmatisch gelöscht ? Normal schon oder ? MfG
Zu beachten ist hier, dass s natürlich gross genug sein muss, da ansonsten über die Grenzen hinweg geschrieben wird (die terminierende 0), das könnte evtl. andere Variablen überschreiben
Was soll eigentlich das hier: int i = strlen(s); s[i+1] = '\0'; <<<--- Überlegt euch mal, wie strlen funktioniert, dann erkennt ihr, daß diese Zeile recht nutzlos ist.
@Rufus T. Firefly: strlen ermittelt den wert von anfang des strings bis zu dem nächsten "\0". Weil ich nicht gleich einen kompletten string zuweise sondern nur die einzelnen bytes manipuliere ist ja nicht gesichert, dass sich noch datenmüll nach dem letzten zeichen befindet (natürlich muss man aufpassen, dass man die länge von s nicht überschreitet). Wenn dann nach meinen neuzuweisungen der einzelnen bytes kein \0 mehr nach dem wert steht komm ich evtl sogar über die granze der variable s hinaus und ich hab nur noch datenmüll nach meinem richtigen wert. Habs grad mal ausprobiert...wenn ich diese zeile weg lasse, dann stahen auf meinem display ganz falsche werte. Aber irgendwie komm ich jetzt schon ins grübeln, weil ich in deinen anderen beiträgen bemerkt hab dass du dich mega super gut auskennst! Gruß und ein großes lob an Rufus für sein großes engagement in diesem Forum! Weiter so ! John
Hallo Müsste das nicht s[i+2] = '\0'; heißen? Weil sonst schreibt man ja an die gleich Stelle wo eh schon '\0' steht. Kann auch sein das ich einen denkfehler habe. Grüße Marius
Hi Beispiel: char s[20] = "Hallo Welt"; int l = strlen(s); l ist jetzt 10 s[l] ist '\0' allso zeigt s[l+1] genau hinter das '\0' Wenn da noch reservierter Speicher ist klappt das durchaus. Matthias
Hallo Ja hatte einen Denkfehler, hab vergessen das von 0 ... strlen(string)-1 die Zeichen gehen und 1 danach das '\0' g. Aber um die Uhrzeit möge man mir das verzeihen g. Grüße Marius
John, Aschereste auf mein Haupt. Natürlich hast Du recht. War wohl etwas spät gestern abend. Allerdings sollte man bei dieser Vorgehensweise höllisch aufpassen, daß der Puffer, in dem der verwendete String liegt, auch wirklich größer ist als der String, so daß das Schreiben der zweiten Null nicht irgendwelche anderen Dinge zerstört. Alternativ könnte man den Puffer vor dem Hineinkopieren des Strings mit memset initialisieren. Ich leg' mich jetzt wohl wieder schlafen. Sorry für die Aufregung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.