Not a Number?
-
Moin hab mal ne Frage.. wenn ich zb einen Ascii umrechner programmieren will will ich bei einem Programm wie es unten beschrieben ist schließlich auch ein Vermeiden von "Nicht Nummern" also sonstigen zeichen vermeiden.. ich bräuchte dafür einen "NaN" wert.. (steht im Quellcode in Zeile 19 als "NaN")
Wollte fragen ob es irgendwie einen solchen Befehl gibt.. bzw als Walkaround vielleicht einen "unendlich wert" (für -unendlich < ascii < unendlich)
wäre nett wenn ich eine gute antwort kriegen würde ^^ danke im vorraus
#include <stdio.h> #include <conio.h> #include <stdbool.h> #include <windows.h> int main() { bool endless=true; int ascii; do { system("cls"); printf("<<Ascii-Umwandler by Yami Sparrow>>\n\n"); printf("Geben sie die Ascii-Zahl die umgewandelt werden soll ein (0 zum beenden):\n"); scanf("%i",&ascii); if (ascii==0) break; else if(ascii<0 || ascii==NaN) { printf("Error!"); ascii=0; } else printf("\n %i = %c\n\n",ascii,ascii); system("pause"); } while(endless==true); }
-
joa, wenn die (signed) integer zahl < 0 oder > 255 ist
denn der ascii zeichensatz besteht ja nur aus 256 zeichen (0-255), in einem unsigned char speicherbar ;), weshalb es evt. auch sinnvoller wäre, ein unsigned char und nicht ein int einzulesen, auch wenn es intern evt. wieder zu int konvertiert wird.
-
Yami schrieb:
printf("\n %i = %c\n\n",ascii,ascii);
Vor das zweite ascii solltest du (char) schreiben:
printf("\n %i = %c\n\n", ascii, (char)ascii);
Denn du versprichst mit %c, dass ein char ankommt, tatsaechlich uebergibst du aber einen int.
-
Christoph schrieb:
Denn du versprichst mit %c, dass ein char ankommt, tatsaechlich uebergibst du aber einen int.
das ist so egal wie der viel zitierte chinesische sack reis. wenn printf das %c sieht, gibt es ein zeichen aus. 'int' oder 'char' stören nicht. es passen beide.
-
hm..
das mit dem 0-255 lösst zwar dieses Problem aber jetzt auch mal für die Zukunft wäre ein NaN nicht schlecht.. gibt es sowas denn garnicht?
Angenommen ich frage irgendwo mal eine zahl ab, z.b. "was ist deine lieblingszahl"
da wäre ein
if(x==NaN) break;
befehl ja durchaus sinnvoll
da ist es ja nicht mit einem zahlen bereich getan. theoretisch könnte jemand auch -1.42662*10^(-300) nehmen. Und das wäre mit einem zahlenbereich kaum zu umfassen (ausser mit -unendlich < x < unendlich)
-
-
du könntest einfach eine Zeichenkette anstatt einer Zahl einlesen.
Diesen prüfst du dann, ob es eine Zahl oder irgendwelcher Mist ist.
und nur, wenn es eine Zahl ist, wandelst du es in einen int um,
ansonsten gibst du eben einen Fehler aus.
-
um mal auf die anfängliche frage einzugehen: überprüf doch einfach den rückgabewert von 'scanf'. ist der 0, dann konnte 'scanf' die eingabe nicht in einen 'int' umwandeln. das passiert z.b, wenn jemand mist (== not a number) eingegeben hat.
-
printf-freak schrieb:
Christoph schrieb:
Denn du versprichst mit %c, dass ein char ankommt, tatsaechlich uebergibst du aber einen int.
das ist so egal wie der viel zitierte chinesische sack reis. wenn printf das %c sieht, gibt es ein zeichen aus. 'int' oder 'char' stören nicht. es passen beide.
Naja, nicht ganz. chars werden für die Übergabe zu int konvertiert.
-
Bashar schrieb:
Naja, nicht ganz. chars werden für die Übergabe zu int konvertiert.
okay, ich gebe zu, dass meine postings nicht durch exaktheit glänzen. kannst du mir noch mal verzeihen?
-
naja meine eigendliche frage wurd ja nicht ganz beantwortet.. sind ja alles nur walkarounds..
-
Yami schrieb:
naja meine eigendliche frage wurd ja nicht ganz beantwortet.. sind ja alles nur walkarounds..
Nö, das waren alles konkrete Lösungsvorschläge, die du nur noch umzusetzen brauchst.
Es gibt kein NaN für chars.Guckst du:
#include <limits.h> #include <windows.h> #include <stdio.h> void clearbuf() { setvbuf(stdin,NULL,_IONBF,0); setvbuf(stdin,NULL,_IOFBF,BUFSIZ); } int input() { char buf[256]={0}; char zonk[256]={0}; int c=0; int res = 0; clearbuf(); fgets( buf, sizeof(buf)-1, stdin ); res = sscanf( buf, "%d %s", &c, zonk ); if ( res != 1 ) return -1; if ( c < 0 || c > UCHAR_MAX ) return -1; return c; } int main() { int c = 0; int run = 'y'; puts("Decimal-ASCII-Converter"); do { printf("Type a number (0-255) to convert: "); if ( ( c = input()) < 0 ) { printf("Wrong input. Try again ? [y/n]"); clearbuf(); run = getchar(); } else { printf("Performing conversion-operation( this may take a while ) ... "); Sleep(3000); printf("done.\n"); printf("Your input was successfully converted.\n"); printf("Type 'v' and hit <Enter> to view the result."); if ( getchar() == 'v' ) printf("%u -> %c\n", c, c ); } }while( run == 'y' ); return 0; }