mikrocontroller.net

Forum: Compiler & IDEs string terminierung überprüfen


Autor: heike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
zuerst danke an alle die für dem Forum zuständig sind, bis jetzt war mir 
das Forum sehr hilfereich.

Also ich möchtegern einen String überprüfen .

problem:wenn ich meine Abfrage als
if((Command[0] == 'm') 
 funktioniert das programm ganz super. aber bei prüfung mit dem Zeile:
if((Command[0] == 'm') && (Command[8] == '\0'))
 funktioniert nur für die erste zweimal eingetippte Befehle und danach 
bekomme ich immer "error" obwohl mein Befehl mit m anfägt.

PS: jeder meiner String ist mit einem '\0' terminiert.
int main(void)
{
  DDRD = 0xff;    // PORTD as outputs
  PORTD = 0x0C;   // Internal pull 
  DDRC = 0xFF;       // outputs for LEDs
  PORTC = 0x00;      // LEDs off

  uart0_init();  //uart0 is use for the connection with the PC
  uart1_init();   //uart1 is use for the connection with the camera
    
  // now enable interrupt, since UART library is interrupt controlled
  sei();

  char Command [LENGTH+1];
 
  for(;;)
  {
      uart0_puts( "\r\n" );
      uart0_gets( Command, LENGTH );
      uart0_puts( Command );

      if(strcmp(Command, "enter") == 0) 
      {
  Send_Command(1);
  uart0_puts( "enter-Kommando ok" );
      }
      if((Command[0] == 'm') && (Command[8] == '\0'))
    Send_MCommand(Command);
      else
   uart0_puts( "error" )
  }  
  return 0;
}


vielen Dank im voraus

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wann schreibt die uart0_gets() exakt an Position Command[8] ein '\0'?

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

Bewertung
0 lesenswert
nicht lesenswert
heike schrieb:

> "error" obwohl mein Befehl mit m anfägt.

Sicher?
Oftmals vertut man sich, weil zb die gets Funktion Steuerzeichen nicht 
richtig ausfiltert. Da bleibt dann im empfangenen String gerne schon mal 
ein \r oder \n oder \t oder ein Leerzeichen hängen, welches eigentlich 
nicht da sein sollte.

>       uart0_puts( "\r\n" );
>       uart0_gets( Command, LENGTH );
>       uart0_puts( Command );

Daher sollte man sich hier, bei der Ausgabe, eine eindeutige Markierung 
ausgeben lassen, an der man in der Ausgabe eindeutig sieht, wo 
tatsächlich der String anfängt bzw. aufhört

        uart0_puts( "&" );    // irgendein Zeichen, dass in Command 
nicht
                              // oder nur selten vorkommen wird
        uart0_puts( Command );
        uart0_puts( "&" );

und jetzt schaust du dir den Kontrollausdruck auf dem Terminal an.
Wenn du dort so etwas vorfindest
&enter&
dann passt alles. Steht dort aber zb
&
enter&
dann hat sich ein \n eingeschmuggelt (erkennbar daran, dass nach dem & 
der Zeilenumbruch erfolgt)
enter&
(also ohne das einleitende &, ist ein Hinweis auf einen einzelnen 
Carriage Return, der ohne LineFeed daherkommt)
& enter&
da ist wohl irgendwo ein Leerzeichen übrig geblieben
&enter &
ditto, aber diesmal ist das Leerzeichen am Ende

....

Autor: heike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank Karl heinz Buchegger.
Du bist ein genie

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

Bewertung
0 lesenswert
nicht lesenswert
heike schrieb:
> vielen Dank Karl heinz Buchegger.

Hat es geholfen?

> Du bist ein genie

Nicht wirklich.
Nur habe ich mir im Laufe der Zeit Techniken angeeignet, mit denen man 
Problemen auf die Spur kommen kann. Eine davon lautet: Wenn ein 
Algorithmus nicht funktioniert, dann überprüfe als allererstes ob der 
Input für diesen Algorithmus überhaupt so ist, wie du das erwartest.
Man möchte es gar nicht für möglich halten, wieviele 'Probleme' damit 
schon aufgeklärt werden können.

Autor: heike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja hat geholfen
danke

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.