You could however trick (or slightly fix) the functions. First remove the memset call from both functions, no need to clear the whole array to simply put a null at the end (every other cell is used).
char buff[13] = {}; //13 to include a null
char *htpbuff; //not an array anymore.
//in your function:
int requiredBecauseBadDesign;
htpbuff = buff;
get_temperature( &requiredBecauseBadDesign );
htpbuff = buff + 6;
get_humidity( &requiredBecauseBadDesign );
//Now buff (and htpbuff) will contain the combined string.
But you should try create your own function from the internals of these two, as they have a 'crappy' design.
You could do that with sting copy but why? You rarely use it. if you want to print "TC1234R%1234" somewhere just print "TC1234" and then "R%1234". Just don't bother concatenating them first.
PaulS:
Why do your functions need to return pointers to global arrays?
I've seen these horrible things before in other questions. They are obviously circulating somewhere. The mere fact they return a length used, while clearing the 'whole' buffer makes them quite irrational.