String leeren

(Firma: Youzone) Persönliche Seite #1441648
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:
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
Lesenswert?

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
Lesenswert?

> 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?).
(Firma: Youzone) Persönliche Seite #1441712
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
Persönliche Seite #1441803
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".
#1443994
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.
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren