sscanf kurze Hilfe

Gast #3986683
Lesenswert?
• ▲
▼
Guten Morgen,

bin schon 2 Tage am verzweifeln. Ganzes Internet durchsucht finde den 
Fehler nicht :(

InputData[0] ist "cmd save 2 9" und wird auch richtig eingelesen.
1
char data2;
2
char data3;
3
char cmd[8];
4
char dataa [8];
5

6

7
if (4 == sscanf(InputData[0], "%3c %4c %1d %1d", cmd, dataa, &data2, &data3)) {
8
  if ((strcmp(cmd,"cmd")==0) && (strcmp(dataa,"save")==0){
9
  //unwichtig
10
  }
Wenn ich die Variablen auslese, steht das drin:
cmd = "cmd" ->OK
dataa = "save" ->OK
data2 = 0 -> FALSCH
data3 = 9 -> OK

Wo liegt das Problem?

Danke schön
#3986699
Lesenswert?
• ▲
▼
Mit den Formatangaben scheinst du übrhaupt ein wenig auf Kriegsfuss zu 
stehen. Deine %c Angaben für die String-Anteile sind auch nicht koscher.
Das sollten eigentlich %s sein und als Zahl gibst du die maximal 
erlaubte Anzahl an Zeichen für diesen String an. Also nicht die Anzahl 
der Character die du erwartest (in deinem Fall 3), sondern die Anzahl 
der Character, die du in deinem Argument (das Array cmd) unterbringen 
kannst. Das sind in deinem Fall 7, weil du ja auch noch 1 Zeichen für 
die Stringterminierung \0 brauchst.

Mittels %3c hast du keinen String eingelesen. Dass die strcpy gut gehen, 
ist eher zufällig, weil in deinem Array vorher schon lauter 0-Bytes 
drinnen waren, die zufällig als String-Terminierung fungieren. %c liest 
Character und keine Strings, hängt also keine String-Terminierung an das 
Ergebnis an.
1
int data2;
2
int data3;
3
char cmd[8];
4
char dataa [8];
5

6

7
if (4 == sscanf(InputData[0], "%7s %7s %d %d", cmd, dataa, &data2, &data3)) {
8
  if ((strcmp(cmd,"cmd")==0) && (strcmp(dataa,"save")==0){
9
  //unwichtig
10
  }

Die 1 bei %1d sparst du dir lieber. Wenn data2 nicht größer als 9 sein 
darf, dann prüfst du das im nachhinein ab und gibst eine entsprechende 
Fehlermeldung, die den Benutzer darauf hinweist, dass dieser Wert nicht 
größer als 9 sein darf. Sich da im Vorhhinein einzuschränken ist nicht 
sehr schlau. Solange alles gut geht und die auszuwertenden Daten auch 
der erwarteten Vorgabe entsprechen ist das alles kein Problem. Zum 
Problem wird es erst, wenn dem nicht so ist. Und da muss man dann auch 
sagen, dass es mit scanf schon recht schwer ist, ausser einem 
nichtssagendem 'Fehler in der Eingabe' eine vernünftige und 
aussagekräftige Fehlermeldung zu generieren, mit der man als 
Aussenstehender auch was anfangen kann und die einem einen Hinweis 
darüber gibt, was eigentlich das Problem ist.
Nichts gegen scanf. Aber wenn es darum geht, einen von einem 
menschlichen Benutzer stammenden String auseinander zu nehmen, würde ich 
es nicht nehmen.
Gast #3986704
Lesenswert?
• ▲
▼
Fehlt in der Zeile nicht noch was?:

if (4 == sscanf(InputData[0], "%3c %4c %1d %1d", cmd, dataa, &data2,...

Müsste es nicht wie folgt heissen?:

if (4 == sscanf(&InputData[0], "%3c %4c %1d %1d", cmd, dataa, &data2,...

oder:
if (4 == sscanf(InputData, "%3c %4c %1d %1d", cmd, dataa, &data2,...
Gast #3986717
Lesenswert?
• ▲
▼
Hab gerade nachgesehen. Ja sscanf erwartet an der Stelle von InputData 
einen Pointer. InputData[0] ist aber kein Pointer.

--> Adressoperator benutzen "&InputData[0]"
--> oder den Index weglassen "InputData"
#3986724
Lesenswert?
• ▲
▼
Decius schrieb:
> Hab gerade nachgesehen. Ja sscanf erwartet an der Stelle von InputData
> einen Pointer. InputData[0] ist aber kein Pointer.

Sagt wer?

Wir wissen nicht, was sich hinter InputData versteckt.

Disclaimer: Es kann natürlich sein, dass du recht hast. Ich denke sogar, 
es ist recht wahrscheinlich, dass du recht hast. Aber solange nicht klar 
ist, was InputData tatsächlich darstellt, ist das Spekulation. Es könnte 
ja auch ein
1
char* InputData[10];   // Ringbuffer aus 10 Strings. Die UART allokiert für
2
                       // für jede eingehende Zeile einen neuen String und
3
                       // legt ihn hier ab
sein.
Es könnte auch ein
1
char InputData[2][20];  // 2 Strings a 20 Zeichen für Double Buffering
sein.
#3986744
Lesenswert?
• ▲
▼
"Das einen Formatangabe von %d nicht zu einem char passt."

Nicht nur dass... je nach Umgebung kann einem sowas den Stack umpflügen 
und zu sehr abstrusen Effekten führen - zB dass andere Variablen 
überschrieben werden oder sogar der Programmablauf durcheinandergerät 
weil Rücksprungaddressen verändert werden....

Antwort schreiben

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.

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.