The "?" comes from the fact that floating point is by default not supported for sprintf in Arduino. The means to add that support is posted in many places on the forum and elsewhere.
sprintf(aa, "%0.7f", a);
The general syntax "%A.B" means A digits before decimal point
Not correct. A is the minimum width of the entire field. If the number takes up less than A spaces, the remaining space is blank filled.
If you are going to use an array to hold the float converted to a string BY ITSELF anyway, dtostrf() will save you the trouble of converting the float to an int and then inserting a decimal point. Your conversion makes some assumptions that are not, in general, true for floats. They may be for your specific float.
For those using an AVR board that want to know more about customizing the Arduino IDE and allowing the extra overhead of the full printf related tools, read on:
The problem is that knowing where to put the compiler flags can be difficult. Compiler options are found in a file called "platform.txt" and in this case we want to add to "compiler.c.elf.extra_flags". If you want to add your own flags without messing up the default Arduino files then use "platform.local.txt" (you will have to create this file). Assuming Windows, for standard Arduino boards, the path to these files is similar to:
*C:\Program Files (x86)\Arduino\hardware\arduino\avr*
If you have a non-standard board, you will need to modify folder options to show hidden folders, and the path is similar to:
_C:\Users*\AppData\Local\Arduino15\packages*\hardware\avr**_
I would recommend simply adding the file "platform.local.txt" and in that file adding the following line: