a) stdout on a unix machine CAN be redirected to a port. Everything in unix is a file. However, to actually redirect stdout (which is where printf goes) you do it when RUNNING the code, not when WRITING the code. You do it like this:
SHELL:>> program > myFile
where "program" is the compiled C code, and "myFile" is the file you want. Now, although this depends on the flavour you're using and how it names its serial ports and how you've initialized (etc...look at the documentation) the upshot is that the serial port itself is a "file" you can redirect to! (as long as you open it). Google it to see exactly how to do it with your particular unix flavour...
b) there is no analog to stdout on a windows machine, and as you said, windows is more restrictive.
c) the ABSOLUTE easiest way I see to do this: just write the serial port code once, and re-use it a thousand times (or google it, it must be on the internet). This way, you're absolutely certain that it will work, and if you change to a new flavour of linux (...unix...) you won't have to search forever to figure out the redirect.
**EDIT: I assumed you weren't using windows in part C. Truthfully, unless you're *stuck* on using C, and if you have windows, just do it on an easier language, like C# (which is how I do all my serial comm. in windows, just because it's like 5 lines of code that's on the internet already). Remember, the robot will only ever see serial messages from the computer, it won't care if you're writing that serial code in C, C#, or FORTRAN (but uh...don't ever use FORTRAN