mikrocontroller.net

Forum: Compiler & IDEs aus string '.' heraustrennen


Autor: HerrmannA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

es gibt in der string.h unter Linux eine Funktion die earse heißt und
folgendes macht

string x=wert;
wert="10.10";
x.erase(2,1);

hier ist dann x=1010;

gibt es sowas auch in der GCC???

will nicht mit schleifen arbeiten.

Danke

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht nach C++ aus, nicht wahr?  Hättest du wahrscheinlich auf
dem AVR auch, wenn wir eine C++-Bibliothek hätten (aber das sieht
so aus, als würde sich Rolf Magnun mittlerweile dafür
interessieren).

Anyway, für normale C-Strings kannst du memmove() benutzen:
char x[] = "10.10";
memmove(x + 2, x + 2 + 1, strlen(x) - 2 - 1 + 1);

Dabei stehen die Zweien für die 2 aus deinem erase(), die Einsen
für die 1 aus deinem erase() mit Ausnahme der letzten +1: die
ist dafür verantwortlich, dass das abschließende '\0' ebenfalls
noch mit kopiert wird.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du die Position des '.' nicht kennst..
char *pp = strchr(x, '.');
if(pp != NULL) 
   memmove(pp, &pp[1], strlen(pp));

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm.
Da kommt überall ein strlen vor. Das schmeckt mir nicht :-)

void strdel( char* where, int start, int len )
{
  strcpy( x + start, x + start + len );
}

char x[] = "10.10";
strdel( x, 2, 1 );

wäre naheliegend, geht aber nicht, da strcpy() fordert,
dass die strings nicht 'überlappen'.

void strdel( char* where, int start, int len )
{
  char* src = where + start + len;
  char* dest = where + start;

  while( *src )
    *(dest++) = (*src++)
  *dest = '\0';
}

Ich hab das jetzt nicht getestet, müsste aber funktionieren.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hat wieder mal der Tepfullerteufel zugeschlagen:

>    *(dest++) = (*src++)

     *(dest++) = *(src++);

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal eine allgemeine Frage:
Wenn ich die Wahl habe zwischen mem.. oder str.. Funktionen, welche
sind effizienter in der Ausführung?

Die mem-Funktionen habe ich bis jetzt nich nie benutzt :-/

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mem* ist effizienter, weil es sich nicht um die Erkennung des
abschließenden Nullbytes kümmern muss, sondern gesagt bekommt,
wie viel Bytes zu bearbeiten sind.

Das heißt, die sind natürlich nur effizienter, wenn du nicht
stattdessen dann noch ein strlen() aufrufen musst.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich halte mich an die einfach Regel:

Habe ich ein Byte-Feld ohne eine 'innere Struktur', dann
benutze ich die mem...() Familie.
Habe ich also Strings (das sind auch nichts anderes als
Byte-Felder, nur halt mit dem klitzekleinen Unterschied,
dass das Ende mit einem '\0' Byte markiert ist) dann
benutze ich die str...() Familie. Die str...() Familie
weiss um dieses '\0'-Byte und bezieht es in Schleifen-
Abbruchbedingungen ein.

Autor: HerrmannA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke das so gehts.

Keine lästigen For schleifen.

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.