Previous discussion on the glibc issue tracker and with the committee seems to indicate that for this case (2)/(3) is the correct result. I find this outcome emotionally upsetting (but then, that describes lots of the specifics of scanf…) but it is at least internally consistent.
glibc for the first case will currently produce r=1, n=2, o=0 which is just nonsense, but at least its acknowledged as a (very old!) bug