This will be coming from someone who is also learning but there are some things i've noticed which i would change. obviously if someone more skilled coments take what that say over what i do.
while ( string = "abc" )
it could just be an infinite loop ex. while ( 1 ). the conditions that matter break the loop and you dont have to worry about add "string = abc" at the end.
in bCheckValid, i would either make constant variables in the main area or just hardcode them into the function, that way there can only be one location if you ever need to change them.
in bGameNotOver you could make it easier on yourself and use a for loop
ex for columns
for ( int i = 0 ; i < 3 ; i++ )
if ( array[ i ] == array[ i + 3 ] && array[ i ] == array[ i + 6 ] )
bIsDraw doesnt look like its in the scope of bGameNotOver
EDIT: at first glance i didnt realize it was a global variable
one that im not quite sure about so i wouldnt listen too it unless someone else agrees or provides more insight, but i think you could remove exit( EXIT_SUCCESS ) and just put return 0; there and you wouldnt need the windows include( EDIT: does work, dont know if it will really change much besides a bit less baggage )
but as i said, just some thoughts from a fellow student :D
EDIT:i just wanted to add, "\n" in strings will also do a new line, just so you dont have to do as many endl;
and after playing it just a little suggestion, reverse the numbers on the board that way the bottom three are 1 2 3, that way it lines up with your numpad.
besides that, great job :D