Wywołanie kodu ascii

Witam,

Może, ktoś mi pomoże bo nie mogę sobie z tym poradzić. Mam takie polecenie:

"Opracować program, który wyprowadza na ekran kod wciśniętego klawisza. Uwzględnić

klawisze specjalne, np. F1, F2, strzałki. Podać kody klawiaturowe strzałek i F1-F10." I doszedłem do czegoś takiego:

#include


using namespace std;


int main(){

   char a;

   cin>>a;

   cin.ignore();

   cout << (int)a << endl;

   getchar();

   return 0;

}

I nie mogę w żadnej książce/necie znaleść nic pomocnego co by powodowało wczytywanie klawiszy specjalnych(F1,F2, strzałki itd.) Drugi problem jaki mam może jest troche głupi i szkolny albo jednak okaże się czymś poważniejszym.

#include 

using namespace std;


int main()

    {


    int a;

    do 

    {

        printf("Napisz liczbe: \n");

        }while(scanf("%d",&a) == 0);








system("PAUSE");

}

Jest to fragment większego programu. Jeśli zostanie wpisana liczba program idzie dalej, jesli zostanie litera, ma jeszcze raz wypisać polecenie do wpisania liczby. Problem polega na dwóch rzeczah. Pętla nie chce się zatrzymac jak sie wpisze litere i napis leci w nieskonczonosc, a drugi jest taki ze jesli wpiszemy np. 1s albo 2sdsd2 to on to traktuje jako liczbe 0 a nie jako blad. Jakby ktos moglby cos mi doradzic, albo gdzie szukac porad byłbym bardzo wdziezny.

Oto rozwiązanie 1 problemu:

//Coded by Derka

//Ansi C keybord.c


#include 

#include 


int read_key(void);

int option;

int main(void)

{



	switch (option= read_key())

	{

            case 59:

             printf ("F1\n");

            break; 


            case 60:

             printf ("F2\n");

            break; 


            case 61:

             printf ("F3\n");

            break; 


            case 62:

             printf ("F4\n");

            break; 


            case 63:

             printf ("F5\n");

            break; 


            case 64:

             printf ("F6\n");

            break; 


            case 65:

             printf ("F7\n");

            break; 


            case 66:

             printf ("F8\n");

            break; 


            case 67:

             printf ("F9\n");

            break; 


            case 68:

             printf ("F10\n");

            break; 


            case 133:

             printf ("F11\n");

            break; 


            case 134:

             printf ("F12\n");

            break;     


            / ************************************************************************* /


            case 72:

             printf ("UP_arrow\n");

            break; 


            case 75:

             printf ("LEFT_arrow\n");

            break; 


            case 77:

             printf ("RIGHT_arrow\n");

            break; 


            case 80:

             printf ("DOWN_arrow\n");

            break;


            case 71:                                       

             printf ("Home\n");

            break;


            case 79:

             printf ("End\n");

            break;


            case 73:

             printf ("PgUp\n");

            break;


            case 81:

             printf ("PgDown\n");

            break;   


            case 82:

             printf ("Insert\n");

            break;  


            case 83:

             printf ("Delete\n");

            break;                                


    }




getch();

return 0;

}



int read_key(void)

{

	int ch;

      if (!(ch = getch())) ch = getch(); else ch = getch();

    return(ch);

}

W twoim przypadku aby wyświetlić kod znaku musisz zamienić fukcję read_key tym oto kodem:

int read_key(void)

{

	int ch;

      if (!(ch = getch())) ch = getch(); else ch = getch();

      printf("Kod znaku: %d ",ch);

    return(ch);

}

Dodam tylko, że klawisze funkcyjne i strzałki mają kod złożony. Oznacza to, że wciśnięcie strzałki pokaże znak o kodzie zero a później kod strzałki, który odpowiada literze h, j, k albo l (jeśli mnie pamięć nie myli). Więc jeśli chcesz odczytać znaki specjalne, potrzebujesz czegoś na kształt:

{

  int ch = 0;

  while (ch = getch())

  {

    if (ch == 0)

    {

      ch = getch();

      printf("Znak specjalny: %d", ch);

    }

    else

      printf("Znak zwykly: %d", ch);

  }

}

Potrzebujesz jeszcze specjalny przypadek dla entera, który wysyła kod 10 i kod 13.

Programik działa elegancko, wielkie thx.