C Eingabe auf INT überprüfen, wie?

necoicould

Lieutenant
Registriert
Feb. 2009
Beiträge
537
Hallöle, ich habe momentan das Problem, dass ich eine Bedingung aufgestellt hab, die Schaut ob die eingegebene Integer keine 0-6 ist. Aber das Problem ist, wenn der User Buchstaben eintippt, dass das Programm dann verrückt spielt. Was müsste ich noch hinzufügen, dass er auch die Bedingung erfüllt, wenn der User Buchstaben eintippt anstatt eiens integer:

Code:
int auswahl2;

printf("Welche Augenzahlen sollen eingetragen werden?\n");
                                scanf("%d", &auswahl2);
                                if ((auswahl2!=1)&&(auswahl2!=2)&&(auswahl2!=3)&&(auswahl2!=4)&&(auswahl2!=5)&&(auswahl2!=6)&&(auswahl2!=0)){
DANN TU DIES UND DAS
 
Code:
...
char buffer[256];

//gets liest direkt einen String von der Standardeingabe
if(gets(buffer) != NULL)
{
    //sscanf() funktioniert wie scanf(), verwendet aber einen string statt der stdin als Eingabe
    // wenn 0 zurückgegeben wird, enthält buffer keinen Dezimalwert
    if(sscanf(buffer, "%d", &auswahl2) != 0)
    {
       ...    
    }
}

Ist eine mögliche Lösung...
 
Zuletzt bearbeitet:
Nimm erstmal einen char* an und dann nutze isdigit() (aus ctype.h).

€: Mach bloß nicht das, was BrainFart sagt. Sonst weinst du hinterher.
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and
because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to
break computer security. Use fgets() instead.
Bist wohl wirklich ein BrainFart und nicht mehr, wenn du solchen Code ernsthaft vorschlägst. Oder war das gar bösartig gemeint?

€2: Und OP, deine if-Abfrage ist ja abenteuerlich. Das ist doch nicht dein Ernst, oder?
Code:
if(!(0 <= x && x <= 6)) { die(in, a, fire); }
 
Zuletzt bearbeitet:
Mal ne Frage:
Wieso schreibst du in deiner if Abfrage nicht einfach "auswahl2<=6 && auswahl2>0"

Die Funktion Atoi kannst du auch nehmen
int atoi ( const char * str );

Beispiel:
int i;
char szInput [256];
printf ("Enter a number: ");
fgets ( szInput, 256, stdin );
i = atoi (szInput);
 
dude90 schrieb:
Die Funktion Atoi kannst du auch nehmen
int atoi ( const char * str );


Die gibt dir aber keine Gewissheit, daß wirklich eine Zahl angegeben wurde. Wird irgend was anderes eingegeben, liefert dir atoi() einfach eine 0.
 
atoi() zu benutzen ist ziemlicher Mist, denn es prüft nicht auf Fehler. Wenn der Benutzer irgend einen
Quatsch eingegeben hat, wird es fröhlich einen Wert zurückliefern, den er wahrscheinlich gar nicht gemeint
hat. Außerdem: Warum liest du 256 Zeichen ein, wenn in einen int nur viel viel viel weniger reinpassen?

€: Gerade kam im IRC ein Vorschlag für dude90:
[01:45:26] <prima> musst schon INT_MAX viele einlesen
[01:45:30] <prima> SONST PASST DAS JA GAR NICHNT
[01:45:33] <secunda> !
[01:45:38] <secunda> stimmt
[01:45:47] <secunda> denn INT_MAX ist ja das maximum
[01:45:54] <secunda> und wenn man weniger nimmt als das maximum
[01:45:57] <secunda> BUFFER OVERFLOW
 
Zuletzt bearbeitet:
asdfman schrieb:
€: Mach bloß nicht das, was BrainFart sagt. Sonst weinst du hinterher.

Bist wohl wirklich ein BrainFart und nicht mehr, wenn du solchen Code ernsthaft vorschlägst. Oder war das gar bösartig gemeint?

Nein, das war tatsächlich nicht böswillig gemeint :rolleyes: Ich vermute, es geht bei der Aufgabe um Informatik-Grundkurs oder so, bis der OP dann mal sicherheitskritische Anwendungen schreibt, sollte er sich der generellen Problematik mit Puffern in C bewusst sein, und entsprechende Vorkehrungen treffen...
Das ist halt die Lösung, die uns im Grundstudium begebracht wurde, selbst würde ich sie natürlich so nicht verwenden, wenn Sicherheit eine Rolle spielt...
 
Man sollte sie grundsätzlich nie verwenden, weil man jederzeit gute Praxis anwenden sollte. Wenn du es
nicht tun würdest, warum hast du es dann so hingepackt, statt direkt eine Lösung zu posten, die du auch
anwenden würdest? Dann würdest du auch nicht so doof da stehen und dich rechtfertigen müssen.

€: An welcher Uni/FH wurde dir der Mist beigebracht? Die merke ich mir dann, falls jemand mal danach fragt,
wo er studieren gehen soll.

Und für dich noch eine Meldung aus dem IRC:
[01:52:06] <prima> ALLES ist fucking sicherheitskritisch
[01:52:36] <prima> es muss nicht ada/haskell und theoretisch bewiesen sein, aber seriously? buffer overflows?
 
Zuletzt bearbeitet:
Code:
{
          eingabeBeibehalten:
          printf(" \n");
          void ignore_rest_of_line(FILE *stream) {
            int c;
            do {
              c = fgetc(stream);
            } while(c != EOF && c != '\n');
          }

                            printf("Welche Augenzahlen sollen beibehalten werden. Wenn KEINE, dann geben Sie 0 ein?\n");
                            scanf("%d", &auswahl1);
                            if (auswahl1>6){
                            	  ignore_rest_of_line(stdin);
                                 printf("##########################################\n");
                                 printf("FEHLERHAFTE EINGABE ! #################### Nur eine Eingabe zwischen 1-6 möglich!:\n");
                                 printf("##########################################\n");
                                 goto eingabeBeibehalten;
                            }
[CODE]

Klappt erstmal^^
 
Oh mein gütiger Gott! Wo hast du dir den Scheiß denn hergeguttenbergt? Da klappen sich ja die Zehennägel hoch!
 
Naja, die Lösung, die ich verwenden würde, wäre diese:

Code:
std::string input;
cin >> input;

std::istringstream inreader(input);

inreader >> auswahl2;

aber ich schätze, das nutzt dem OP nicht viel... Hab reine Texteingaben mit C seit dem Studium nicht mehr machen müssen, die bessere Lösung in C wäre wohl über getline(), weil das automatisch genügen Speicher alloziert...
 
Die Ausgabe müsste er trotzdem immer noch darauf prüfen, ob sie in dem Bereich liegt, den er haben will.
Wie man das macht, habe ich in meinem ersten Post erzählt. Aber auf mich hört ja mal wieder keiner.
 
Sagt man Zickenkrieg nicht einer anderen "Randgruppe" nach? Naja, nun halt auch bei den Nerds.

Könnt mich gerne zerfleischen dafür:
Wie wäre es damit?
Returns true (non-zero) if character-string parameter represents a signed or unsigned floating-point number. Otherwise returns false (zero).
Code:
#include <ctype.h>
#include <stdlib.h>
int isNumeric (const char * s)
{
    if (s == NULL || *s == '\0' || isspace(*s))
      return 0;
    char * p;
    strtod (s, &p);
    return *p == '\0';
}

Quelle: http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#C
 
Ich find's auch langsam witzig, mit welcher Zielstrebigkeit hier eine korrekte Lösung ignoriert wird und stattdessen irgend welche halbbackenen "Lösungen" angeboten werden. :D
 
Zuletzt bearbeitet:
Zurück
Oben