Resource icon

Positiv- und Negativlisten bei scanf

Programmiersprache(n)
c
Betriebssystem(e)
Linux
Positiv- und Negativlisten bei scanf

Mit der Anweisung

scanf(„%[0123456789+-*/=]“, formula);


werden nur Zeichen eingelesen die in der Liste sind(rechteckige Klammern).
Bei Eingabe eines Zeichens das nicht in dieser Liste steht. Wird die Eingabe in
die betreffende Variable beendet ohne die Zeichen zuzuweisen.



Mit der Anweisung

scanf(„%[^\n]“, formula);


werden alle Zeichen außer dem new line Zeichen(Enter-Taste) als Eingabe akzeptiert, auch
das Leerzeichen. Die negativ-Liste beginnt mit dem "^"-Zeichen, dem französischen circonflexe
auf deutsch Zirkumflex.
Dazu hier einmal ein einfaches Beispiel:
Code:
#include <stdio.h>
#include <stdlib.h>

void clpuf(void)
{
while (getc(stdin) != '\n')
    ;
}

int main()
{
int i;
char c_posi[200],  c_nega[200];

for (i = 0; i < 200; i++)
      c_posi[i] = c_nega[i] = 0;

printf("Beispiel Positiv- und negativ Liste bei scanf\n");

printf("\nBitte zum Test einen String\nMuster.....: 123430abc  \neingeben.\nEingabe:  ");

/** liest nur Zeichen ein die innerhalb der eckigen Klammern stehen
   * und beendet die Eingabe in  die Variable beim ersten Zeichen, das nicht
   * in der Liste steht*/
scanf("%[0123456789+-*/=]", c_posi);
printf("Die Eingabe war: %s \n\n", c_posi);

/** Beseitigt die restlichen im Tastaturpuffer stehenden Zeichen, da diese sonst
   * bei der naechsten Eingabe wieder verwendet werden */
clpuf();

printf("\nBitte zum Test einen String\nMuster.....: asdfgh123  \neingeben.\nEingabe:  ");
scanf("%[^1234567890]", c_nega);
printf("Die Eingabe war: %s \n\n", c_nega);

clpuf(); /** Tastaturpuffer leeren*/

printf("\nBitte zum Test einen String mit Leerzeichen eingeben\nEingabe:  ");
/** liest alle Zeichen ausser den Newline-Zeichen(Enter-Taste) ein*/
scanf("%[^\n]", c_nega);
printf("Die Eingabe war: %s \n\n", c_nega);

printf("Das Programm wird nun beendet.....\n");
return EXIT_SUCCESS;
}
Die selbstgestrickte Funktion
clpuf()
muss hier dabei sein, da ja scanf() die Eingabe beim ersten "falschen" Zeichen abbricht und diese
sonst im Tastaturpuffer stehen bleiben. Bei der nächsten Eingabe würden diese wieder verwendet
und eine fehlerhafte Eingabe verursachen.
Hier die Ausgabe des Beispiels in der Konsole:
Code:
Beispiel Positiv- und negativ Liste bei scanf

Bitte zum Test einen String
Muster.....: 123430abc
eingeben.
Eingabe:  65432323bvn
Die Eingabe war: 65432323


Bitte zum Test einen String
Muster.....: asdfgh123
eingeben.
Eingabe:  abcdefgh3422
Die Eingabe war: abcdefgh


Bitte zum Test einen String mit Leerzeichen eingeben
Eingabe:  Ein Hund ist kein Dideldödler!
Die Eingabe war: Ein Hund ist kein Dideldödler!
Würde man nun
Code:
scanf("%10[^0123456789]", name1);
verwenden, dann begrenzt man die Anzahl der maximal einzugebenden Zeichen auf 10.
Diese Variante Zeichen einzulesen, könnte man verwenden, um zum Beispiel die Länge
eines Strings zu begrenzen, welcher später zum Beispiel in eine Dezimalzahl umgewandelt wird.
So etwas kann man benutzen, um etwa bei der Eingabe einer rationalen oder irrationalen Zahl,
die versehentlich mit einem Komma statt einem Punkt vorgenommen wurde, durch Ersatz des Kommas
durch einen Punkt für die Umwandlung in eine int-Variable lesbar zu machen.
Aber das sollte jeder Programmierer selber für sich entscheiden.

Mit
Code:
fgets(name1, 100, stdin);
kann man auch Strings mit Leerzeichen eingeben, auch deutsche Sonderzeichen ö,ä,ü,ß
funktionieren, zumindest bei mir auf der Linux-Konsole.
Zumindest bekomme ich eine Warnung keim kompilieren, das man 'getc' nicht mehr verwenden sollte.


Weitere Seiten im Web zum Thema Tastaturpuffer löschen:
https://stackoverflow.com/questions/13986794/clearing-keyboard-buffer-in-c
https://www.geeksforgeeks.org/clearing-the-input-buffer-in-cc/
Autor
rustyoldguy
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen
Oben