www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik scanf ("%c%*c",&Antwort)


Autor: RW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
scanf ("%c%*c",&Antwort); // %c%*c ???
 while(Antwort == 'j');

warum wird hier nicht %c alleine genutzt?

was genau passiert hier? ich gebe doch als zweiten parameter von scanf 
ausschließlich &Antwort an. Wird hierbei ein Pointer erzeugt?

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

Bewertung
0 lesenswert
nicht lesenswert
Sieh dir in den Formatbeschreibung an, welche Bedeutung der *  in %*c 
hat :-)

Edit:
Hab gerade selbst danach gegoogelt. Ist relativ schwer zu finden. Daher 
die Auflösung: Der * bedeutet: Für diese Angabe im Formatstring wird 
keine Zielvariable als Argument übergeben.

http://www.wachtler.de/ck/B_4_Formatstring_fur_scanf_.html

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RW schrieb:
> scanf ("%c%*c",&Antwort); // %c%*c ???
>  while(Antwort == 'j');
>
> warum wird hier nicht %c alleine genutzt?
Weiß man nicht. Vermutlich, weil es sich um eine Konsolenanwendung 
handelt, und der Programmierer unfähig ist, die Konsole in den 
kanonischen Modus umzuschalten.
So wie es jetzt ist, sieht es aus, als ob das %*c den Zeilenvorschub 
nach Drücken der Enter-Taste aufessen soll.

> was genau passiert hier? ich gebe doch als zweiten parameter von scanf
> ausschließlich &Antwort an.
Antwort bekommt das erste Zeichen, das kein Leerzeichen ist, danach wird 
noch ein Zeichen gegessen und wegen des Sternchens verworfen, daher auch 
kein weiterer Parameter.

Ein der Manualseite zu 'scanf' steht es dick:
* An optional assignment-suppressing character ’*’ .

> Wird hierbei ein Pointer erzeugt?
Durch das &, ja.

Autor: RW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Gott, was ein Krampf. habe grade den code von jmd vorgesetzt 
bekommen, der klassisch c lernt mit irgendnem windows consolen compiler 
oder so


und nun schulde ich ihm ne antwort. ist Auch für mich ist es 
überraschend, das Ergebnis!!!!

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RW schrieb:
> Mein Gott, was ein Krampf. habe grade den code von jmd vorgesetzt
> bekommen, der klassisch c lernt mit irgendnem windows consolen compiler
> oder so
Ja?

* Der Quelltextschnippel ist unvollständig.
* Als du gepostet hast, hast du die Hinweise drei Zeilen über dem 
Textfeld nicht gelesen.
* Als du scanf() benutzt hast, hast du nicht in ein C-Buch geschaut.
* Du hast nicht mit Google gesucht. 
http://de.lmgtfy.com/?q=scanf+sternchen
* Die Frage nach 'warum' kann man dir nicht beantworten, da jeglicher 
Kontext fehlt.

Darf man also fragen, was genau dich jetzt angepisst hat?
Achso, unfähig zu sein, etwas zu tun, das hat nicht zwangsläufig etwas 
damit zu tun, zu blöd dazu zu sein, falls du dich daran störst.

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

Bewertung
0 lesenswert
nicht lesenswert
>> warum wird hier nicht %c alleine genutzt?
> Weiß man nicht. Vermutlich, weil es sich um eine Konsolenanwendung
> handelt, und der Programmierer unfähig ist, die Konsole in den
> kanonischen Modus umzuschalten.

Was immer auch ein kanonischer Modus ist.
C weiß jedenfalls nichts davon. Für C ist stdin ein Input Stream, der 
gebuffert sein kann und bei dem eine Eingabe mittels \n abgeschlossen 
wird.

> So wie es jetzt ist, sieht es aus, als ob das %*c den Zeilenvorschub
> nach Drücken der Enter-Taste aufessen soll.

Das wird auch ziemlich sicher die Erklärung dafür sein.
Ein übrig gebliebener \n im Input Stream ist ein permanenter 
Stolperstein aller scanf-Einleser. Ein darauffolgender scanf("%s", 
irgendwas); krallt sich diesen \n sofort als Ende der Stringeingabe und 
treibt damit den Blutdruck eines Newbie hoch, der das Programm sofort 
beschuldigt, dass es seinen eingegbenen Namen nicht einlesen will.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Antwort bekommt das erste Zeichen, das kein Leerzeichen ist

7.19.6.2 The fscanf function
...
8 Input white-space characters (as specified by the isspace function)
  are skipped, unless the specification includes a [, c, or n specifier.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Das wird auch ziemlich sicher die Erklärung dafür sein.
> Ein übrig gebliebener \n im Input Stream ist ein permanenter
> Stolperstein aller scanf-Einleser.

scanf() ist ja sowieso ziemlich übel. ;-)

Korrekterweise hätte man das wohl so geschrieben:
#include <ctype.h>
#include <stdio.h>

int get_yes(void) {
   char buf[100];

   if (fgets(buf, sizeof buf, stdin) == NULL)
     return -1; /* nothing read */

   char *cp;
   for (cp = buf; *cp != 0 && isspace(*cp); cp++)
     ;
   if (*cp == 0)
     return 0; /* nothing entered */
   return tolower(*cp) == 'j'? 1: 0;
}

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt natürlich; habe mich vertan.
Obacht aber, wenn als letztes oder erstes im Format-String ein 
Leerzeichen hineinrutscht..

Kanonischer Modus ist, wenn die Eingaben zeilenweise gepuffert werden. 
Um das abzustellen, hat man unter Windows aus <conio.h> eine 
getch()-Funktion; unter unixoiden stellt man das mit termios umstellen.

Autor: RW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> * Der Quelltextschnippel ist unvollständig.
> * Als du gepostet hast, hast du die Hinweise drei Zeilen über dem
> Textfeld nicht gelesen.
> * Als du scanf() benutzt hast, hast du nicht in ein C-Buch geschaut.
> * Du hast nicht mit Google gesucht.


unvollständig? richtig, ich könnte das Projekt komplett posten, falls du 
es kompilieren willst, ist doch scheiß egal, was mit dem eingelesenen 
passiert, hier ging es um die formatierungen INNERHALB der scanf fkt.

Welches Textfeld?

scanf benutzt? wie gesagt ich habe es nicht genutzt... siehe oben.....

google? Da muss ich dir ausnahmsweise mal Recht geben....

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso:
Ich mache auch Fehler und habe auch mal angefangen und so weiter.
Ich bin gerne bereit, mir eine Stunde Zeit für einen Anfänger zu nehmen, 
aber nicht, um einem Anfänger davor zu schützen, mal in ein Buch zu 
schauen.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RW schrieb:
> Sven P. schrieb:
>> * Der Quelltextschnippel ist unvollständig.
>> * Als du gepostet hast, hast du die Hinweise drei Zeilen über dem
>> Textfeld nicht gelesen.
>> * Als du scanf() benutzt hast, hast du nicht in ein C-Buch geschaut.
>> * Du hast nicht mit Google gesucht.
>
>
> unvollständig? richtig, ich könnte das Projekt komplett posten, falls du
> es kompilieren willst, ist doch scheiß egal, was mit dem eingelesenen
> passiert, hier ging es um die formatierungen INNERHALB der scanf fkt.
So meinte ich das nicht. Es wäre aber zumindest schön gewesen, zu 
wissen, woher welche Variable kommt. Mal abgesehen, dass der Quelltext 
bestenfalls in einer Endlosschleife endet, was im Original doch 
sicherlich nicht beabsichtigt war, oder?

Oder Kontest: Woher soll jemand wissen, warum da nicht "%c" alleine 
steht? Es weiß doch niemand, woher die Eingaben kommen und wie sie 
aussehen. Vielleicht ist es ja doch was ganz Anderes und meine Glaskugel 
hat sich mit der Konsole getäuscht.

> Welches Textfeld?
Das, wo du den Beitrag eingegeben hast, und da, wo steht:
Formatierung - C-Code.

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.