¡Cuidado con esto!
char conversion[2];
Un “vector de 2 caracteres” puede almacenar una cadena de hasta 1 carácter “útil” ya que se ha de reservar uno para indicar el final de la cadena con el carácter nulo (valor numérico cero) según el estándar de cadenas del lenguaje C.
Si quieres una cadena de dos caracteres has de definirla con un tamaño de 3:
char conversion[3];
Por ejemplo, el siguiente fragmento de programa asignará valores a los primeros veintiún bytes apuntados por buffer. El vigésimo valor será el carácter ’4’ (valor numérico 52), mientras que el vigesimoprimero será el carácter nulo (valor numérico cero).
int hora = 2;
int minuto =34;
sprintf(buffer, "La hora actual %02d:%02d", hora, minuto);
Si se han reservado únicamente 20 bytes para alojar la cadena, el carácter finalizador de la cadena se guardará en una zona de memoria que “no le pertenece” alterando muy posiblemente el valor de otra variable. Esto podría afectar al comportamiento del programa y causar fallos difícilmente localizables. Puede que sea esto lo que te está pasando.
Así que si queremos una cadena de 20 caracteres útiles, hemos de “reservar” 21.
char buffer[21];
Aún así, recomiendo siempre para estos casos ser un poco más “generoso” y reservar algo más de memoria por si accidentalmente la cadena resulta ser un poco más grande de lo previsto. Tomemos como caso el ejemplo anterior en el que la variable minuto llegase a valer 100. Entonces la cadena sería
"La hora actual 02:100"
porque el %02 indica que se quiere que el número sea de al menos dos dígitos (añadiendo ceros por la izquierda si fuera necesario) pero no se “recorta” si tiene más de dos dígitos. Entonces para almacenar esta cadena se necesitan 22 bytes (los 21 “que vemos” más el carácter nulo que indica el final de la cadena en C/C++). Así que, si se han reservado solo 21, volvemos a tener el peligro de que se escriba un valor cero en una zona de memoria que no deba. Corrompiendo tal vez el valor de otra variable.
Pero tampoco nos pasemos a la hora de definir el tamaño de un buffer de estos, que no andamos sobrados de memoria.
Recuerden: el carácter
'A'
es un único byte. Minetras que la cadena
"A"
son dos bytes, el carácter
A
seguido de un carácter nulo.