Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » getc oder scanf?
Druckversion
Druckversion
Antworten
Antworten
Autor
Kein bestimmter Bereich getc oder scanf?
RatMac
Junior Letzter Besuch: im letzten Quartal
Dabei seit: 28.01.2020
Mitteilungen: 8
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-03-21


Ich habe mal eine große Verständnisfrage.

Ich habe hier ein Programm, in welchem ich eine unendliche for-Schleife verwende. Bei zweiten Durchgang dieser Schleife wird mir nur eine weitere Eingabe von 'i' gestattet, wenn ich zusätzlich getc(stdin); nach dem scanf benutze.
Wenn ich das weglasse, wird mir zwar die Eingabefrage gestellt, aber das Programm schließt dann.
Als Laie frage ich mich ersthaft, warum beim zweiten mal kein scanf mehr durchgeführt wird, wenn ich danach aber z.B. sogar noch ein printf anfüge, wird dieses ausgeführt und dann das Programm geschlossen.





Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5874
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-03-21


Hallo RatMac,

nachdem du die Zahl eingegeben hast, musst du ja ENTER drücken. Die Zahl wird der Variablen i zugeordnet. Das ENTER ist aber noch im Eingabepuffer. Durch getc(stdin) wird das ENTER aus dem Eingabepuffer entfernt. Machst du das nicht, wird bei scanf("%c", &e) das ENTER der Variablen e zugeordnet. Und da ENTER ungleich 'a', bricht das Programm wegen des return-Befehls ab.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27292
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2020-03-25


Damit hier noch was Brauchbares steht (der TS interessiert sich offenbar nicht mehr für den Thread):
C
int main()
{
   int   zahl,             // die eingegebene Zahl
         faktor,           // Faktor für Teilertest
         faktorflip = 2;   // Schrittweite für Faktor
   char  zeichen;          // das eingelesene Zeichen
   char  *text;            // Text für gerade/ungerade
 
   printf("Beenden mit einem beliebigen Zeichen, natürlich außer Ziffer!\n\n");
   printf("Zahl : ");
   // es müssen 2 Items eingelesen werden, sonst Ende
   while (2 == scanf("%d%c", &zahl, &zeichen)) {
      if (zahl % 2 == 0) {
         text = "gerade";
         }
      else {
         text = "ungerade";
         }
      // eigentlich würde man das so lösen:
   // text = (zahl % 2 == 0) ? "gerade" : "ungerade";
      printf("%d ist %s, die Quadratzahl ist %d, die Primfaktoren sind", zahl, text, zahl*zahl);
      faktor = 2;
      while (zahl > 1) {
         if (zahl % faktor == 0) {
            printf(" %d", faktor);
            zahl /= faktor;
            }
         else { // faktor ist kein Teiler, den nächsten Faktor wählen
            faktor = (faktor == 2) ? 3 : faktor+2;
            // besser so:
         /*
            switch (faktor) {
               case 2:
                  faktor = 3;
                  break;
               case 3:
                  faktor = 5;
                  break;
               default: // damit wird jede dritte ungerade Zahl ausgelassen, nämlich die vom Typ 6k+3 (ist  keine Primzahl)
                  faktor += faktorflip;
                  faktorflip = 6 - faktorflip;
               }
         */
            }
         }
      printf("\n"); // Liste der Primfaktoren abschließen
      printf("\nNeue Zahl (Ende mit beliebigem Zeichen) : ");
      }
 
   return 0;
} // main



-----------------
Bild



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5874
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-03-25


@viertel

2020-03-25 11:51 - viertel in Beitrag No. 2 schreibt:
C
...
   while (2 == scanf("%d%c", &zahl, &zeichen)) {
...


Es geht auch
C
...
   while (1 == scanf("%d%*c", &zahl)) {
...
Dann erspart man sich die Variable zeichen.

Was ich nicht wusste und mich wundert, ist, dass
text = "gerade";
funktioniert. Aber ich habe es gerade ausprobiert. Wo legt denn das Programm die Zeichenkette "gerade" ab? Wird der Speicherbereich wieder freigegeben, wenn text auf eine neue Zeichenkette zeigt?

Grüße
StrgAltEntf



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27292
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2020-03-25


text ist ein char*.
"gerade" und "ungerade" sind Zeichenkonstanten, eigentlich char[], die irgendwo im Programm abgelegt werden.
Und damit wird text der Zeiger auf die eine oder andere Konstante zugewiesen.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 5874
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2020-03-25


2020-03-25 20:32 - viertel in Beitrag No. 4 schreibt:
text ist ein char*.
"gerade" und "ungerade" sind Zeichenkonstanten, eigentlich char[], die irgendwo im Programm abgelegt werden.
Und damit wird text der Zeiger auf die eine oder andere Konstante zugewiesen.

Ich hatte hier ein paar Bedenken, die aber nun nach einem Testprogramm wohl ausgeräumt sind. Was dazu gelernt 😃



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]