title: portable alternative to kbhit() and getch() and system("cls")
body: <p>I need a way to use kbhit and getch functionality in a portable way.  I'm currently developing a simple ascii game and I need to detect if a key is pressed.  If it is I need to read it and if it isn't I need to continue without waiting for input.  I would prefer not to echo it, but I won't be to picky about that.  I think kbhit and getch would be great for this, BUT I'm only allowed to use fully portable code(well at least code for linux, mac and PC, not a lot of other OSes come to mind though).  As I understand it the termios, curses, and conio libraries aren't fully implemented on all three OSes I need.  I'm at a loss.  Every solution I have found uses non-portable code.  Is there someway I'm able to write portable functions for this myself?  I'm currently including stdio.h, stdlib.h,  and time.h.  I also need a portable way to clear the screen as I'm currently using system("cls") and system("clear") which must also be changed every time I change the OS, or is the a way I could do an if-else and detect the OS the code is running on to switch between these two statements.  Here is a segment of code that has these functions:</p>
  
  <pre><code>    char key = ' ';
      while(1)
      {
          system("cls");
          if (_kbhit())
          {
              key =_getch();
              printf("output: %c", key);
          }    
          else
              printf("output:");
      }
  </code></pre>
  
  <p>This is essentially what functionality I need in my code, but I can't figure out a portable way to do it, and my teacher requires the code to work on Linux, mac, and pc using standard c and standard libraries.  Please help!  And no c++ please, we are using c.</p>
  
  <p>EDIT: I don't think ncurses wasn't quite what I was looking for.  Someone recommended I use <code>#ifdef</code> to implement these at compile time.  I like this solution, but I need some help understanding how to do this on linux and mac as I can only test on windows with my current setup.  hopefully I will soon have linux running on my other machine for testing, but OSX has a big price tag with it, so I would appreciate the help.  Here's the current code:</p>
  
  <pre><code> //libraries
  #include &lt;stdio.h&gt;      //used for i/o
  #include &lt;stdlib.h&gt;     //used for clearing the screen
  #include &lt;time.h&gt;       //used to get time for random number generator
  
  //check OS and include necessary libraries
  #ifdef _WIN32
      //code for Windows (32-bit and 64-bit, this part is common)
      #include &lt;conio.h&gt;
      #define CLEARSCREEN system("cls")
      #define CHECKKEY _kbhit()
      #define NBGETCHAR getch()
  
  #elif __APPLE__
      //code for mac
      #define CLEARSCREEN system("clear")
      #define CHECKKEY 
      #define NBGETCHAR 
  
  #elif __linux__
      //code for linux
      #define CLEARSCREEN system("clear")
      #define CHECKKEY 
      #define NBGETCHAR 
  
  #else
  #   error "Unknown compiler"
  #endif
  
  int main()
  {
      char key = ' ';
      while(1)
      {
          CLEARSCREEN;
          if (CHECKKEY)
          {
              key=NBGETCHAR;
              printf("output: %c", key);
          }    
          else
              printf("output:");
      }
  }
  </code></pre>