I cannot figure out why the program is running like it should after this line..
The act of printing the char is effectively adding a delay, so when the loop iterates again enough time has passed for another character to be received by the serial port. Remove the printing and the loop runs so fast that it's finished before the next character has arrived.
Given that it seems you will always have 3 characters I think the simplest thing to do is
while (Serial.available() < 3); // wait for three characters
for( i = 0 ; i < 3;) // stick them in the array, you could use memcpy() here
{
char_in[i++] = Serial.read();
}
char_in[i] = '\0';
(far from bullet proof but should work)
The for loop to clear the array is not necessary as the array will be overwritten anyway. However to be safe you can null the string by just placing a \0 in the first location.
Rob