whiteさんの仰るとおり実行時にバッファのサイズを決めるのであれば、
new演算子やmalloc関数を使うのが一般的と思われます。
例えば以下のようになります。
int func( char *s1, char *s2 )
{
char *buff = new char[strlen(s1)+strlen(s2)+1]; // バッファの確保
int n;
sprintf( buff, "%s%s" s1, s2 );
n = atoi( buff );
delete [] buff;
return n; // バッファの開放
}
余談ですが、ルーイさんのsizeof()の使い方が気になります。
(Sが大文字なので独自の関数だとしたら余計なお世話です。すみません)
stringクラスはsizeof演算子では文字列の長さが取れません。
length()メンバ関数を使用する必要があります。
また、sizeof(B)としても帰ってくる値はおそらく 4 だと思います。
int型を10進整数の文字列に変換する場合、最大文字数は10文字です。
(符号がつくならさらに+1)
ですので、snprintf関数に渡す値としてSizeof(A)+Sizeof(B)というのは不適当と思われます。
(最大文字数を指定するだけなので問題があるとは言い切れませんが。)
また、printfなどのフォーマット系では、sprintf( s, "%50d", i)などの使い方をした場合、
50文字分の領域が必要になることにも注意が必要です。