String leeren

OP (Firma: Youzone) Persönliche Seite #1441648
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:
1
// an Posteingang anhängen
2
 
3
while(*posteingang) posteingang++; // stringende suchen
4
*posteingang++ = Temp;     // zeichen anhängen
5
*posteingang = 0;       // neues stringende

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

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

probiert, allerdings funktioniert das nicht.

Muss man vielleicht das Stringende anders suchen ?

Danke

Gruß

pirat
Gast #1441694
Warum nicht einfach
1
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
1
memset(posteingang, 0, posteingang_last_used -posteingang);
aus.

HTH
Persönliche Seite #1441705
> Ich leere den String jetzt nach dem ; so:
>
>
1
> while(*posteingang) {
2
> *posteingang='\0';
3
> posteingang++;
4
> 
5
> }
6
>
>
> 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?).
Persönliche Seite #1441803
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".
#1443994
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.
1
char * canfuegen(char * string, size_t stringLen, char einfg )
2
{
3
  char * start = string;
4
  while( *string )
5
    string++;
6

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

10
  *string++ = einfg;
11
  *string = '\0';
12
  
13
  return start;
14
}
15

16
int main()
17
{
18
  char string[3] = "";
19

20
  canfuegen( string, sizeof( string ), 'a' );
21
  canfuegen( string, sizeof( string ), 'b' );
22
  canfuegen( string, sizeof( string ), 'c' );
23
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.