Forum: Compiler & IDEs String leeren


von Isak S. (Firma: Youzone) (pirat) Benutzerseite


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

von Jörg G. (joergderxte)


Lesenswert?

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

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

Ich leere den String jetzt nach dem ; so:
1
while(*posteingang) {
2
*posteingang='\0';
3
posteingang++;
4
5
}

Geht das besser ?

pirat

von Gast (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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?).

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


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

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

Ich werde mir erstmal Pointer in C anschauen.

pirat

von Rufus Τ. F. (rufus) Benutzerseite


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".

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

Hallo!

Ginge das so:

http://pastebin.ca/1609600

?

piratus

von Karl H. (kbuchegg)


Lesenswert?

Grundsätzlich ja, auch wenn es sehr kompliziert geschrieben ist.

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

Wie könnte man das einfacher schreiben ?

piratus

von Karl H. (kbuchegg)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.