Strings

Gast #151024
Lesenswert?

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ß
Gast #151025
Lesenswert?

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
Gast #151026
Lesenswert?

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
Gast #151027
Lesenswert?

>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] = ',';
}
Gast #151028
Lesenswert?

@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
Gast #151030
Lesenswert?

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
Gast #151032
Lesenswert?

@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
Gast #151034
Lesenswert?

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
Gast #151036
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren