Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » scanf wird übersprungen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.02.2009, 13:08 Uhr
~Incredible
Gast


Guten Tag,

in meinem programm soll zuerst ein wort eingegeben werden
danach ein bustabe

die methode soll gucken wie oft der bustabe in dem wort drin war

wenn ich jedoch das wort eingeben kommt sofort die ausgabe die eingabe von dem bustaben wird übersprungen.

was mache ich falsch ?

mfg

incredible


C++:
#include <stdio.h.>

int sucheZeichen(char x[], char c){
    
    int i = 0;  
    int counter = 0;
    while(x[i] != '\0'){
              
      if(x[i] == c){
              
        counter ++;
        }
    i++;
}
    return counter;
}

int main(){

   int groesse = 20;
   char c[groesse];  char d;
   printf("Bitte geben Sie in Wort ein: ");
   scanf("%s",&c);
   printf("Nach welchem Bustaben wollen Sie suchen? ");
   scanf("%c",&d);
   int anzahl = sucheZeichen(c,d);
   printf("\nDer Bustabe %c war %i mal im Wort %s drin.",d,anzahl,c);
   system("Pause");
   return 0;
}



Bearbeitung von 0xdeadbeef:

Tags begradigt.


Dieser Post wurde am 07.02.2009 um 16:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.02.2009, 13:42 Uhr
CppProgrammer



Wenn das scanf "übersprungen" wird, liegts vermutlich daran dass im Eingabebuffer noch irgendwas drin steht.

Also am besten zwischen dem ersten und dem zweiten scanf einmal den Buffer flushen, z.B. mit flushall().
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.02.2009, 16:17 Uhr
0xdeadbeef
Gott
(Operator)


Man kann nach wie vor nur Ausgabepuffer flushen. Was soll es denn überhaupt bedeuten, einen Eingabepuffer zu flushen? Wegschmeißen, was sich gerade im Programmpuffer befindet? Bis zum Ende der Zeile ignorieren? Alles auslesen, was da noch kommt? So oder so wäre das eher ein drain als ein flush.

4.4BSD hat eine Funktion fpurge, die etwas derartiges macht, aber natürlich ist es je nach Zustand des Programmes ziemliche Glückssache, was dabei eigentlich passiert. Windows erlaubt fflush auf Eingabeströme, mit der gleichen Problematik. Wohldefiniert ist das alles nicht. Was du in diesem Fall willst, ist, bis zum Ende der Zeile zu ignorieren, also stumpf

C++:
while(getchar() != '\n');


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.02.2009, 19:04 Uhr
öni



Der interpretiert einfach dein Enter als Zeichen und das kannst du vehinder mit der Schleife die beefy geschrieben hat.

Wobei mich es wundert das bei dir kein Compilerfehler kommt bei den Zeilen:


C++:

   int groesse = 20;
   char c[groesse];
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.02.2009, 19:53 Uhr
Kest
saint


Seit C99 gits's Arrays variabler Länge.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.02.2009, 19:59 Uhr
Tommix




Zitat von öni:
Wobei mich es wundert das bei dir kein Compilerfehler kommt bei den Zeilen..


C99 - Kest war schneller.
Allerdings ist bei
Zitat:

C++:
scanf("%s",&c);



das '&' zuviel.
Und was passiert, wenn wenn der Benutzer 21 Zeichen eintippt?
- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.02.2009, 20:28 Uhr
0xdeadbeef
Gott
(Operator)


c und &c unterscheiden sich nur im Typ (c verfällt zu char*, &c ist ein char(*)[20], wobei ich jetzt eigentlich nachschlagen müsste, wie sich das da mit vlas verhält). Das Einlesen lässt sich mit

C++:
scanf("%20s", c);


sicherer gestalten, im Fall von Arrays Variabler Länge muss dazu aber der format string manuell zusammengebaut werden. Oder man macht das ganze gleich mit fgets, damit lassen sich dann auch gleich Sätze abarbeiten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.02.2009 um 20:29 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.02.2009, 20:58 Uhr
~f.-th.
Gast


soweit ich mich erinnere interpretieren verschiedene
Compiler scanf(...) nicht einheitlich. Weis gerade
nicht wie das war, der muss das & haben und andere
dürfen es nicht haben. Es waren noch vor C99 Compiler.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.02.2009, 23:16 Uhr
0xdeadbeef
Gott
(Operator)


Dieser ganze Kram stand (sans vlas) auch in C89 schon drin. Beides funktioniert, weil es im Endeffekt das selbe ist. Beim scanf-Aufruf geht der Typ durch die Ellipse eh verloren.

Das ganze funktioniert natürlich nur, wenn c direkt ein Array ist, nicht, wenn es ein Zeiger auf z.B. einen Heap-Bereich ist - in dem Fall ist &c die Adresse des Zeigers auf dem Stack.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.02.2009 um 23:17 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: