PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : grenzwerte beim einlesen von zahlen überprüfen



corsair
05-11-2005, 15:27
Hallo,

ich habe diese Codezeilen:



#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

peschmae
06-11-2005, 00:45
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ä

corsair
06-11-2005, 07:06
mhh... ich compiliere auch mit gcc. zur veranschaulichung meines problems noch ein paar mehr zeilen:



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?

peschmae
06-11-2005, 09:44
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ä

RapidMax
06-11-2005, 22:13
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