In C language, strings are actually arrays of characters. This seems like they would have to be only fixed length strings, the length of the array. To allow strings to be shorter than the length of the array, C functions like dtostrf() put a zero character after the last character they make. Other functions like Serial.print() use this zero character to know where the string ends and do not print the other characters from the array that come after that. So the zero character terminates the string.
In order to hold the zero character, you must always make your character arrays one character longer than you need. If you don't, functions like dtostrf() will write to memory locations that are not part of the character array, and may be part of another variable. This can give some strange errors, like the one you have seen.
The reason your second string prints as expected is random luck. That character array is also too short, but perhaps the memory locations after it are not used.
Note: when I said "zero character" this does not mean '0', it means the ASCII character with the code 0, which is not printable, and is also called a "null character".