Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem bei if und gets(array)

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 < [ 2 ]
000
23.12.2003, 21:27 Uhr
lubU




C++:

int abc()
{

char eingabe1[100], eingabe2[100], eingabe3[100];
clrscr();
printf("Eingabe1: "); // <-- Die Zeile wird geprintet aber die Eingabe übersrungen
gets(eingabe1);
printf("Eingabe2: ");
gets(eingabe1);
printf("Eingabe3: ");
gets(eingabe1);

return 0;
}

int main()
{

int wahl;
printf("blabla: ");
scanf("%d", &wahl);
if ( wahl == 1)
{
abc();
}

return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.12.2003, 21:36 Uhr
0xdeadbeef
Gott
(Operator)


Meine einzige Vermutung dazu wäre, dass der Stream nicht rechtzeitig geflusht wird. Dagegen hälfe:

C++:
int abc()
{
  char eingabe1[100], eingabe2[100], eingabe3[100];

  printf("Eingabe1: ");
  fflush(stdout); /* <--- flusht den Stream manuell */
  fgets(eingabe1, 100, stdin); /* <--- gets ist unsicher, wg. Buffer Overflows */
  printf("Eingabe2: ");
  fflush(stdout);
  fgets(eingabe2, 100, stdin);
  printf("Eingabe3: ");
  fflush(stdout);
  fgets(eingabe3, 100, stdin);

  return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.12.2003, 22:28 Uhr
lubU



1. was bedeutet flushen ?

2. kann es sein dass fgets(array, ..., ...)
immer ein \n hinter den stringsetzt ?
kommt mir so vor weil ich beim printf dann en ganzen Absatz hab
wenn ich printf("\n %s", array) mache.

Dieser Post wurde am 23.12.2003 um 22:39 Uhr von lubU editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.12.2003, 22:39 Uhr
0xdeadbeef
Gott
(Operator)


IO ist normalerweise gebuffert. Das bedeutet, dass der In- bzw. Output vor der weiteren Verarbeitung erstmal in den Speicher der Shell geschrieben wird - man macht das, um die Anzahl langwieriger Hardwarezugriffe zu verringern. Das bedeutet im Klartext, dass printf die Daten nicht sofort an die Grafikkarte schickt, sondern erstmal in einen Buffer schreibt, der beim nächsten Flush (spülen beschreibt es recht gut) an die Graka gesendet wird. Wann der Flush erfolgt, ist systemabhängig.

Warum das so gemacht wird, wird vor allem bei Dateien klar - wenn bei jedem fputc wieder die Festplatte angesprochen würde, wäre IO sehr, sehr, sehr langsam. Mit fflush forcierst du einen Flush, das heißt, die Daten werden sofort an die entsprechende Hardware geschickt - in diesem speziellen Fall erfolgt sofort die Ausgabe auf stdout.

Ich nehme an, dass der Fehler, den du hattest, nicht allein darin bestand, dass die Zeile nicht ausgegeben wurde, sondern dass, bevor etwas ausgegeben wurde, eine Eingabe von dir verlangt wurde. In diesem Fall wurde stdin abgefragt, bevor die Daten auf stdout geschrieben wurden; dazwischen fehlte ein flush, der mit den fflushes, die ich eingefügt habe, erzwungen wird.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.12.2003, 22:41 Uhr
lubU



und schon wieder was gelernt !!
hab meinen post oben editiert. hatte noch ne frage zu fgets....
*kuskch du oben*

Dieser Post wurde am 23.12.2003 um 22:42 Uhr von lubU editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.12.2003, 22:47 Uhr
0xdeadbeef
Gott
(Operator)


Was fgets angeht: In der Regel schon, aber nicht immer.

Wen die ganze Zeile in den Buffer passt, ja. Dann wird auch das Newline in den Buffer gelesen. Wenn das nicht der Fall ist, wird so viel wie möglich der Zeile in den Buffer gelesen; wenn das newline nicht mehr passt, ist es auch nicht am Ende des Buffers. Damit kannst du gut überprüfen, ob die ganze Zeile eingelesen wurde.

Natürlich ist das in C++ viel einfacher, aber in C musst du sowas noch von Hand machen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.12.2003, 22:52 Uhr
lubU



und zwecks der zeilenüberspringung....


C++:
printf("\n Name: ");
fflush(stdout);
fgets(name, 100, stdin);
printf("\n Geburtsdatum: ");
fflush(stdout);
fgets(geb, 20, stdin);
printf("\n Strasse: ");
fflush(stdout);
fgets(strasse, 100, stdin);
printf("\n Ort: ");
fflush(stdout);
fgets(ort, 100, stdin);
printf("\n PLZ: ");
fgets(plz, 100, stdin);
fflush(stdout);
printf("\n Tel. Festnetz: ");
fgets(telefon, 100, stdin);
printf("\n Tel. Mobil: ");
fflush(stdout);
fgets(handy, 100, stdin);




Er übersrpingt name.
das sieht dann so aus:

name:
Geburtsdatum: _ ( da blinkt der cursor ( name = null ) )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.12.2003, 21:42 Uhr
0xdeadbeef
Gott
(Operator)


Bei mir macht er das nicht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.12.2003, 22:14 Uhr
~pali
Gast


. . . wobei Du natürlich stdin flushen musst und NICHT stdout !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.12.2003, 23:13 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat:
0xdeadbeef postete
...dazwischen fehlte ein flush, der mit den fflushes, die ich eingefügt habe, erzwungen wird.

Wobei das aber mit Vorsicht zu genießen ist, da (soweit ich weiß) das "flushen" von Eingabeströmen nicht standard Konform ist und es somit vom Betriebsystem und/oder Kompiler abhängt ob es denn gewünschten Effekt oder ein undefiniertes Verhalten hervorbringt.

Alllerdings hatte ich bisher auch noch keine Probleme damit, ich wollte es nur mal anmerken
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: