mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Strings


Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: OlliK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OlliK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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] = ',';
}

Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OlliK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Normal schon oder ?
Ja, der Speicher wird automatisch wieder freigegeben.

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: John (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus T. Firefly:
Fehler passieren jedem !!!

Gruß John

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.