Forum: Compiler & IDEs string terminierung überprüfen


von heike (Gast)


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
1
if((Command[0] == 'm')
 funktioniert das programm ganz super. aber bei prüfung mit dem Zeile:
1
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.
1
int main(void)
2
{
3
  DDRD = 0xff;    // PORTD as outputs
4
  PORTD = 0x0C;   // Internal pull 
5
  DDRC = 0xFF;       // outputs for LEDs
6
  PORTC = 0x00;      // LEDs off
7
8
  uart0_init();  //uart0 is use for the connection with the PC
9
  uart1_init();   //uart1 is use for the connection with the camera
10
    
11
  // now enable interrupt, since UART library is interrupt controlled
12
  sei();
13
14
  char Command [LENGTH+1];
15
 
16
  for(;;)
17
  {
18
      uart0_puts( "\r\n" );
19
      uart0_gets( Command, LENGTH );
20
      uart0_puts( Command );
21
22
      if(strcmp(Command, "enter") == 0) 
23
      {
24
  Send_Command(1);
25
  uart0_puts( "enter-Kommando ok" );
26
      }
27
      if((Command[0] == 'm') && (Command[8] == '\0'))
28
    Send_MCommand(Command);
29
      else
30
   uart0_puts( "error" )
31
  }  
32
  return 0;
33
}

vielen Dank im voraus

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


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
1
&enter&
dann passt alles. Steht dort aber zb
1
&
2
enter&
dann hat sich ein \n eingeschmuggelt (erkennbar daran, dass nach dem & 
der Zeilenumbruch erfolgt)
1
enter&
(also ohne das einleitende &, ist ein Hinweis auf einen einzelnen 
Carriage Return, der ohne LineFeed daherkommt)
1
& enter&
da ist wohl irgendwo ein Leerzeichen übrig geblieben
1
&enter &
ditto, aber diesmal ist das Leerzeichen am Ende

....

von heike (Gast)


Lesenswert?

vielen Dank Karl heinz Buchegger.
Du bist ein genie

von Karl H. (kbuchegg)


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.

von heike (Gast)


Lesenswert?

ja hat geholfen
danke

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.