Вы используете переменную без инициализации, и выполнение этого кода будет неопределенным поведением.
Возможно, вы имели в виду:
char thename[42];
cm++;
sprintf(thename, "tutmap%d.map", cm);
Если у вас есть snprintf, вот функция, которая документируетчто вы гарантируете («подтвердите»), что буфер достаточно большой, но затем также проверяет длину буфера и прерывает работу, если вы допустили ошибку:
template<int N>
void fixed_sprintf(char (&array)[N], char const *format, ...) {
va_list args;
va_start(args, format);
int used = vsnprintf(array, N, format, args);
va_end(args);
if (used == N - 1) {
throw whatever_exception_type_you_like("buffer too small");
// or even:
abort();
}
}
«Фиксированный» означает «фиксированный размер»,не "противоположность сломанной".:)