Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Frage zum Scanf-Befehl

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
21.11.2007, 22:54 Uhr
~alskdfj
Gast


Hallo,

kann ich mit dem Scanf befehl irgendwie steuern wieviele werte eingelesen werden? Den ich habe folgende Aufgabe gestellt bekommen:


Zitat:

Schreiben Sie ein C-Programm, das eine unbekannte Anzahl von Float-Zahlen in ein Array einliest, das 6 Elemente groß ist. Berechnen Sie anschließend den Mittelwert und von jedem eingegebenen Wert die Abweichung vom Mittelwert.

Wenn mehr als 6 Zahlen eingelesen werden, soll eine Fehlermeldung erfolgen und das Programm beendet werden. Da Sie eine beliebige Anzahl Zahlen einlesen sollen, informieren Sie sich bitte über die scanf-Anweisung, wie das Problem gelöst werden kann. Es ist auch möglich auf eine Dateiendekennung bei einer Terminaleingabe abzufragen.


Kann der scanf-Befehl dazu etwas besonderes? ich würd einfach hergehen und sagen Platz für 6 zahlen, also werden nur 6 eingelesen. fertig. ist aber wohl nicht im sinne der aufgabenstellung.

kann mir da jemand helfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.11.2007, 23:29 Uhr
0xdeadbeef
Gott
(Operator)



C++:
scanf("%f %f %f %f %f %f", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]);


...oder

C++:
int i;
int a[6];

for(i = 0; i < 6; ++i) {
  scanf("%f", &a[i]);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.11.2007, 09:15 Uhr
~alskdfj
Gast


danke, das war mir aber schon klar.

mir geht es um folgenden satz in der aufgabenstellung der mich etwas verunsichert:

Zitat:

Wenn mehr als 6 Zahlen eingelesen werden, soll eine Fehlermeldung erfolgen und das Programm beendet werden. Da Sie eine beliebige Anzahl Zahlen einlesen sollen, informieren Sie sich bitte über die scanf-Anweisung, wie das Problem gelöst werden kann.


so wie du das geschrieben hast, würd ich das vermutlich auch machen. dadurch verhindere ich aber das mehr als 6 zahlen eingelesen werden - oder nicht? damit komme ich ja gar nicht in die situation das mehr eingelesen werden kann, oder ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.11.2007, 11:23 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Du kannst mit scanf nicht beliebige viele Variablen einlesen. Die Anzahl muss vorher festgelegt sein.

Du könntest einen String einlesen und den dann parsen um zu schauen wieviele Zahlen da drin stehen, aber dafür wäre scanf nicht die Optimale Lösung da das Einlesen ja beendet wäre sobald Enter gedrückt wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.11.2007, 18:02 Uhr
~alskdfj
Gast


ich hab was gegoogelt und bin da auf den infoschnipsel gestoßen das scanf mir wohl sowas ein EOF liefert bzw. die anzahl der gelesenen argumente. weis das jemand was von?

hab es leider nicht genauer gefunden. liefert mir scanf ein fehlercode wenn ich mehr argumente angeben als ich vorgesehen hab einzulesen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.11.2007, 18:26 Uhr
0xdeadbeef
Gott
(Operator)


scanf gibt dir zurück, wie viele Elemente erfolgreich eingelesen wurden. Also z.B.

C++:
double x;
int *a = NULL;
size_t n = 0;

while(scanf("%lf", &x) == 1) {
  int *tmp = realloc(a, ++n * sizeof(int));

  if(tmp == NULL) {
    fputs("Fehler!", stderr);
  }

  a = tmp;

  a[n - 1] = x;
}

/* ... */

free(a);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.11.2007, 00:05 Uhr
~alskdfj
Gast


Hab das hier gefunden:

www.ee.eng.hawaii.edu/~tep/EE160/Book/chap3/subsection2.1.4.1.html

demnach müsste mir scanf ein EOF flag returnen wenn ich mehr einlese als vorgesehen. Aber ich kann zum verrecken viele eingaben angeben. scanf liefert mir immer nur die maximal anzahl eingelesen argumente zurück.

hab ich es mit einer anderen implementierung zu tun oder bin ich einfach zu blöd?


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

int main(int argc, char* argv[])
{
   float myArray[6]= {0, 0, 0, 0, 0, 0};


   int i=0;
   printf("Geben Sie bitte eine Fliesskommer-Zahl an (max. 6 Zahlen erfassen!!): ");
   i = scanf("%i %i %i %i %i %i", &myArray[0], &myArray[1], &myArray[2],
                                  &myArray[3], &myArray[4], &myArray[5]);
   if(i == EOF)
   {
    printf("\nEOF eingetroffen");
   }

   printf("\n%i", i);

   return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.11.2007, 00:38 Uhr
0xdeadbeef
Gott
(Operator)


scanf gibt immer die Anzahl der eingelesenen Elemente zurück. Du kannst mit der Funktion feof prüfen, ob im betreffenden stream eof erreicht wurde, aber in dieser Situation würde ich mich darauf nicht verlassen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
26.11.2007, 10:54 Uhr
~alskdfj
Gast


also, ich hab mal etwas rumprobiert.

ich hab ein scanf gemacht der 7x %f einlesen soll, aber nur 6 variablen zum speichern. return value war 6. er hat sich richtig verhalten, was er mit der siebten zahl gemacht hat weis ich nicht.

ich kann die eingabe allerdings nicht abbrechen, ich bleibe solange im promt, bis ich 7 zahlen eingelesen habe oder schrott(z.b. buchstaben).

egal was ich mache, scanf macht keinen fehler......

kann ich einen scanf eingabe von mehreren variablen irgendwie kontrolliert beenden, falls ich z.b. maximal 6 werte einlesen will. es soll aber auch gültig sein nur 2 werte einzulesen.

oder kann ich das nur durch ein loop lösen wo ich dann zahl für zahl einlese und jedesmal frage "wollen sie weitere zahlen erfassen"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: