Not a Number?



  • 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;
    }
    

Anmelden zum Antworten