Strings

Gast #151024
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
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
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
>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
@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
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 #151031
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.
Gast #151032
@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 #151033
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
Gast #151034
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 #151035
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
Gast #151036
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.