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


von RW (Gast)


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?

von Karl H. (kbuchegg)


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

von Sven P. (Gast)


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:
1
* An optional assignment-suppressing character ’*’ .

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

von RW (Gast)


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!!!!

von Sven P. (Gast)


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.

von Karl H. (kbuchegg)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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:
1
#include <ctype.h>
2
#include <stdio.h>
3
4
int get_yes(void) {
5
   char buf[100];
6
7
   if (fgets(buf, sizeof buf, stdin) == NULL)
8
     return -1; /* nothing read */
9
10
   char *cp;
11
   for (cp = buf; *cp != 0 && isspace(*cp); cp++)
12
     ;
13
   if (*cp == 0)
14
     return 0; /* nothing entered */
15
   return tolower(*cp) == 'j'? 1: 0;
16
}

von Sven P. (Gast)


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.

von RW (Gast)


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

von Sven P. (Gast)


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.

von Sven P. (Gast)


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.

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.