sprintf question

On Arduino Uno, Arduino 1.0

#include <stdio.h>;

char aString[20];

void setup()
{
  Serial.begin(9600);
  
  sprintf(aString, "No: %f", 1234.12);
  Serial.println(aString);

  sprintf(aString, "No: %7.2f", 1234.12);
  Serial.println(aString);

  sprintf(aString, "No: %7.2f", (float)1234.12);
  Serial.println(aString);
}

void loop()
{
}

Above code produces the following:

No: ?
No: ?
No: ?

I was expecting more like:

No: 1234.12
No: 1234.12
No: 1234.12

What am I doing wrong?
Is the "f" format not supported in Arduino stdio.h?
Thanks,

The AVR LibC does not support floating point formatting in printf. I think it was to keep the library size down.

From Arduino stdio.h:

For floating-point conversions, if you link default or minimized
version of vfprintf(), the symbol \c ? will be output and double
argument will be skiped. So you output below will not be crashed.
For default version the width field and the "pad to left" ( symbol
minus ) option will work in this case.

I think the problem is that in order to support %f in sprintf and its cousins, stdio needs to link in the floating point library. If the program doesn't use floating point maths and you never use a %f format specifier, this is a waste of space.

#include <stdlib.h>
char *float2s(float f, unsigned int digits=2)
{
  static char buf[16];
  return dtostre(f, buf, digits, 1);
}

See - avr-libc: <stdlib.h>: General utilities - for more supported functions...

Thanks everyone for the info - especially thanks to robtillaart. dtostrf() does the job.