Forum: Mikrocontroller und Digitale Elektronik Strings


von John (Gast)


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ß

von OlliK (Gast)


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

von John (Gast)


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

von OlliK (Gast)


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] = ',';
}

von John (Gast)


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

von OlliK (Gast)


Lesenswert?

>Normal schon oder ?
Ja, der Speicher wird automatisch wieder freigegeben.

von Christof Krüger (Gast)


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

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von John (Gast)


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

von Marius (Gast)


Lesenswert?

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

von Matthias (Gast)


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

von Marius (Gast)


Lesenswert?

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

von Rufus T. Firefly (Gast)


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.

von John (Gast)


Lesenswert?

@Rufus T. Firefly:
Fehler passieren jedem !!!

Gruß John

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
Noch kein Account? Hier anmelden.