www.mikrocontroller.net

Forum: Compiler & IDEs String leeren


Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

Ich lese Zeichen von der seriellen Schnittstelle.

Das einkommende Zeichen habe ich in der Variablen Temp. Alles was vor 
einem ";" reinkommt soll in posteingang:
// an Posteingang anhängen
 
while(*posteingang) posteingang++; // stringende suchen
*posteingang++ = Temp;     // zeichen anhängen
*posteingang = 0;       // neues stringende

Aber wie kann ich meinen Posteingang jetzt nach einem ';' wieder leeren 
?

ich abes es mal mit
posteingang[0]='\0';

probiert, allerdings funktioniert das nicht.

Muss man vielleicht das Stringende anders suchen ?

Danke

Gruß

pirat

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du wirst dir schon den Startpunkt (=den Wert von 'posteingang' vor der 
Schleife) merken müssen.

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich leere den String jetzt nach dem ; so:
while(*posteingang) {
*posteingang='\0';
posteingang++;

}

Geht das besser ?

pirat

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht einfach
memset(posteingang, 0, iPOSTEINGANG_SIZE);
? Leert zwar ggf. mehr als nötig, funktioniert dafür aber extrem 
zuverlässig:-)

Und wegen der Performanz: Wenn man sich einen potenziellen 
Pufferüberlaufkandidaten einhandeln will, dann nullt man nur
memset(posteingang, 0, posteingang_last_used -posteingang);
aus.

HTH

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich leere den String jetzt nach dem ; so:
>
>
> while(*posteingang) {
> *posteingang='\0';
> posteingang++;
> 
> }
> 
>
> Geht das besser ?

Nein. Solange Du nur einen veränderlichen Pointer auf den String benutzt 
("posteingang"), kannst Du den String nicht löschen/leeren.

Das geht nur, wenn Du Dir einen Pointer auf den Anfang des Puffers 
aufhebst, auf den zu Beginn Deiner Aktivitäten posteingang zeigt (bzw. 
zeigen sollte; initialisierst Du posteingang überhaupt?).

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Ich versuche Befehle vom Schema <befehl>; über die Serielle 
Schnittstelle zu empfangen. Hier ist die ganze Funktion:

http://pastebin.ca/1607673

Sie wird in einer Endlosschleife immer wieder aufgerufen.

Der Vergleich des Strings liefert immer ist immer FALSE.

??

Ich weiß nicht, wie das mit den Pointern geht.

pirat

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werde mir erstmal Pointer in C anschauen.

pirat

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das solltest Du wirklich tun.

Du initialisierst Deinen "posteingang" so:

        char *posteingang="";

Wieviele Bytes Platz bietet der Speicher, auf den "posteingang" zeigt?

Genau eines.

Das bedeutet, daß so gut wie jeder Schreibzugriff, den Du auf diesen 
Pointer durchführst, auf nicht dafür vorgesehenen Speicher durchgeführt 
wird.

Das überschreibt also munter irgendetwas und kann die interessantesten 
Nebeneffekte haben - Stichwort "buffer overflow".

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ginge das so:

http://pastebin.ca/1609600

?

piratus

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

Bewertung
0 lesenswert
nicht lesenswert
Grundsätzlich ja, auch wenn es sehr kompliziert geschrieben ist.

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie könnte man das einfacher schreiben ?

piratus

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

Bewertung
0 lesenswert
nicht lesenswert
Keine globalen Werte für die maximale Stringlänge. Und dafür aber einen 
vernünftigen Returnwert mit dem der Aufrufer gleich weiterarbeiten kann 
bzw. der eine Aussage über Fehler geben kann. Sieh dir zb. die ganzen 
str... bzw. strn... Funktionen an, wie die das machen.
char * canfuegen(char * string, size_t stringLen, char einfg )
{
  char * start = string;
  while( *string )
    string++;

  if( (size_t)( string - start ) > stringLen - 2 )
    return NULL;

  *string++ = einfg;
  *string = '\0';
  
  return start;
}

int main()
{
  char string[3] = "";

  canfuegen( string, sizeof( string ), 'a' );
  canfuegen( string, sizeof( string ), 'b' );
  canfuegen( string, sizeof( string ), 'c' );
}

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.