Anzeige:
Ergebnis 1 bis 5 von 5

Thema: grenzwerte beim einlesen von zahlen überprüfen

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.08.2003
    Beiträge
    7

    Question grenzwerte beim einlesen von zahlen überprüfen

    Hallo,

    ich habe diese Codezeilen:

    Code:
    #include <stdio.h>
    #include <sys/types.h>
    #include <inttypes.h>
    
    int main(void)
    {
    	uint8_t age;
    	printf("Bitte geben Sie ihr Alter ein: ");
    	scanf("%" SCNu8, &age);
    	printf("Sie sind %" PRIu8 " Jahre alt.\n", age);
    }
    Ich möchte nun gerne eine überprüfung machen, ob die eingegebene Zahl auch in die variable age passt. Leider weiß ich nicht, wie ich das anstellen soll. Ich dachte erst ich könnte das mit den in limits.h angegebenen Werten überprüfen, ob die Variable größer als möglich ist, aber das kann ich ja erst machen, wenn die variable schon eingelesen (d.h. flasch eingelesen?) ist, oder nicht?

    Wäre nett, wenn mir jemand eine möglichkeit nennen kann, wie ich das anstellen soll.

    Grüße,

    Markus

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Bei mir ist, wenn die Zahl zu gross ist, dann der grösstmögliche Wert den die Variable annehmen kann gesetzt.

    Allerdings weiss ich nicht ob das Standardverhalten ist; kann auch sein dass das nichtportables gcc-spezifisches Zeugs ist oder so. Müsste man nachgucken

    Falls du eine Zeile mehrmals angucken willst generell geht das mit einem Buffer, dann eine Zeile als String einlesen und sscanf() darauf loslassen.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.08.2003
    Beiträge
    7
    mhh... ich compiliere auch mit gcc. zur veranschaulichung meines problems noch ein paar mehr zeilen:

    Code:
    markus@armada ~/temp $ gcc -Wall -std=c99 -Os -o test test.c
    markus@armada ~/temp $ ./test 
    Bitte geben Sie ihr Alter ein: 19
    Sie sind 19 Jahre alt.
    markus@armada ~/temp $ ./test 
    Bitte geben Sie ihr Alter ein: 300
    Sie sind 44 Jahre alt.
    markus@armada ~/temp $ ./test 
    Bitte geben Sie ihr Alter ein: 657
    Sie sind 145 Jahre alt.
    markus@armada ~/temp $
    ich habe also eine variable, die durch ihre 8bit nur werte von 0-255 (insg. also 256 werte) aufnehmen kann. gibt man jetzt eine zahl ein, die größer als 255 ist, wie zum beispiel 300, dann reichen ja 8bit nicht mehr aus. beim beispiel 300 würde die binärzahl ja so aussehen 100101100. Die eins, die nun ganz links ist, passt nun nicht mehr in die variable. angezeigt wird nun bei der ausgabe "korrekt" 300-256=44.

    Ich weiß nun überhaupt nicht, was mit der "1" passiert, zum anderen möchte ich gerne dieses Verhalten abfangen.

    peschmae: dein vorschlag wäre also nun die zeile in einen buffer einzulesen und dann mit sscanf() in eine variable zu schreiben um anschließend den Wert der Variablen mit dem eingelesen buffer zu vergleichen?
    Geändert von corsair (06-11-2005 um 07:14 Uhr)

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von corsair
    mhh... ich compiliere auch mit gcc. zur veranschaulichung meines problems noch ein paar mehr zeilen:
    ...
    ich habe also eine variable, die durch ihre 8bit nur werte von 0-255 (insg. also 256 werte) aufnehmen kann. gibt man jetzt eine zahl ein, die größer als 255 ist, wie zum beispiel 300, dann reichen ja 8bit nicht mehr aus. beim beispiel 300 würde die binärzahl ja so aussehen 100101100. Die eins, die nun ganz links ist, passt nun nicht mehr in die variable. angezeigt wird nun bei der ausgabe "korrekt" 300-256=44.
    Ok, dann ist das hier anders; ich hatte das für ints getestet. Also vergiss was ich oben erst geschrieben habe

    Ich weiß nun überhaupt nicht, was mit der "1" passiert, zum anderen möchte ich gerne dieses Verhalten abfangen.

    peschmae: dein vorschlag wäre also nun die zeile in einen buffer einzulesen und dann mit sscanf() in eine variable zu schreiben um anschließend den Wert der Variablen mit dem eingelesen buffer zu vergleichen?
    Das ist, denke ich eine recht gute Lösung. Mit Modulo 10 die einzelnen Stellen der Zahl rausholen und mit dem Buffer vergleichen.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Ein saubere Lösung wäre die Zahl als string einzulesen und dann mit strtol() in ein int zu konvertiern, strtol() erkennt Overflows. Danach machst du einen Range-Check ob es in den 8Bit Typ passt und dann kannst du es konvertiern.

    Gruss, Andy

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •