scanf unterschiedlich viele Variabeln
-
Hallo,
Ich möchte mit scanf 3 Variablen einlesen:
ABER... Sollte die erste Variable der Buchstabe "e" sein, soll er abbrechen. Falls ich nur eine Zahl eingebe, soll er scanf unterbrechen und diese eine zahl übergeben, wenn 2 zahlen und kein e eingebe, dann soll er die beiden variablen übergeben und NICHT nach dem e fragen...
Kann man das mit scanf realisieren?
Ich habe mal ein bischen probiert, aber mir scheint scanf weist die eingabewerte erst zu, nachdem man 3 eingegeben hat (wenn er 3 erwartet).Gibts eine andere einlesefunktion die das kann?
Falls das nicht geht müsste ich ja 3 mal hintereinander scanf benutzen und das ist doch doof!ich würde mcih über eine Antwort sehr freuen
-
Hi, sei gegrüßt!
Mit scanf wirst du nicht viel Glück haben, wenn nur einmal eingelesen werden soll.
Du kannst die komplette Eingabe auf einmal mit fgets in einen char-Puffer einlesen und dann den Inhalt auswerten. Dabei ist die Funktion sscanf hilfreich, was die genau macht entnimmst du einer Bibliotheksdokumentation.Guckst du hier:
#include <stdio.h> int main() { int a=0, b=0, c=0, // Variablen für die Eingabe. n=0; // Zur Überprüfung der Anzahl der von sscanf eingelesenen Werte. char e=0; // Abbruch Parameter. char buf[BUFSIZ] = {0}; // BUFSIZ: definiert in stdio.h, meist 512 printf("Eingabe [a b c]: " ); fgets ( buf, sizeof(buf), stdin ); // Eingabe ab in den Puffer. // sscanf gibt die Anzahl der erfolgreich eingelesenen Werte zurück. if ( 1 == sscanf ( buf, "%c", &e ) ) // Ist der erste Parameter ein Zeichen? { // Ja. if ( e == 'e' ) // Ist das Zeichen ein 'e' ? { puts ( "Abbruch." ); return 0; // Jepp. Soll abbrechen. } else { puts ( "Fehler in der Eingabe!" ); return 1; // Alle Buchstaben außer das 'e' ist eine fehlerhafte Eingabe. } } // sscanf gibt die Anzahl der erfolgreich eingelesenen Werte zurück, die Anzahl // wird in n gespeichert. n = sscanf ( buf, "%d %d %d", &a, &b, &c ); printf( "Anzahl erfolgreich eingelesener Werte: %d.\n", n ); return 0; }
Gruß,
B.B.
-
jo super!
Vielen Dank!
-
Also es geht zwar alles, aber ich versteh es noch nicht so ganz und werde aus der Dokumentation auch nicht schlau.
char buf[BUFSIZ] = {0};
Was macht das genau? -- eine Character Variable festlegen die buf heißt und die größe BUFSIZ hat und den Wert 0 bekommt?
-----------------------------------------fgets ( buf, sizeof(buf), stdin );
Mir ist die syntax hier nicht ganz klar. Ich denk mal fgets ließt von der Tastatur wegen stdin ein und speichert das in buf. Wofür braucht man sizeof(buf)??
-----------------------------------------
if ( 1 == sscanf ( buf, "%c", &e ) )
Und Hier? - 1 == sscanf -- (was heist das)? Also irgendwie fällt mir hier wenig zu ein.
-----------------------------------------
Mein Problem bei der Dokumentation ist, das ich vieles noch nicht verstehe, da mir die Begrifflichkeiten oft fremnd sind und wenn ich dann eine sache nachschaue, tauchen 3 weitere fragen auf... Ich habe grade erst angefangen mit C# und wir sind im Script noch nicht sehr weit.
Vll könntet ihr mir ja trotzdem weiter helfen
-
TurboELK schrieb:
char buf[BUFSIZ] = {0};
Was macht das genau? -- eine Character Variable festlegen die buf heißt und die größe BUFSIZ hat und den Wert 0 bekommt?
Fast. Ein Array von chars, und jeder einzelne wird mit 0 initialisiert (= bekommt den Wert 0)
fgets ( buf, sizeof(buf), stdin );
Mir ist die syntax hier nicht ganz klar. Ich denk mal fgets ließt von der Tastatur wegen stdin ein und speichert das in buf. Wofür braucht man sizeof(buf)??
Es werden maximal soviele Zeichen in buf geschrieben, wie dort Platz ist (sizeof(buf)) - ansonsten würde man womöglich über das Ende von buf hinausschreiben und so lustige Sicherheitslücken erzeugen.
if ( 1 == sscanf ( buf, "%c", &e ) )
Und Hier? - 1 == sscanf -- (was heist das)? Also irgendwie fällt mir hier wenig zu ein.
sscanf gibt die Anzahl der eingelesenen Zeichen zurück. Und das wird dann mit 1 vergleichen.
Ich habe grade erst angefangen mit C# und wir sind im Script noch nicht sehr weit.
Für C# bist Du eh falsch hier - hier geht's um C.