sprintf()
を伝える方法はありません 末尾の null を書き込まないでください。あなたができることは sprintf()
を使うことです 一時的な文字列に書き込み、次に strncpy()
のようなものに書き込みます 必要なバイトのみをコピーします。
sprintf は、書き込まれた文字列の長さ (ヌル ターミナルを含まない) を返します。それを使用して、ヌル ターミナルがどこにあるかを知り、ヌル ターミナル文字を別のもの (つまり、スペース) に変更できます。 strncpy を使用するよりも効率的です。
unsigned int len = sprintf(str, ...);
str[len] = '<your char here>';
sprintf() でこれを行うことはできませんが、できる プラットフォームによっては、snprintf() でできるようになります。
置換する文字数を知る必要があります (ただし、それらを文字列の途中に配置しているため、おそらくそれはわかっているはずです)。
これが機能するのは、snprintf() の一部の実装では、終了文字が書き込まれることを保証していないためです - おそらく stncpy() などの関数との互換性のためです。
char message[32] = "Hello 123, it's good to see you.";
snprintf(&message[6],3,"Joe");
この後、「123」は「Joe」に置き換えられます。
文字列が切り捨てられても、snprintf() が null 終了を保証する実装では、これは機能しません。したがって、コードの移植性が懸念される場合は、これを避ける必要があります。
snprintf() のほとんどの Windows ベースのバージョンは、この動作を示します。
しかし、MacOS と BSD (おそらく Linux) は常にヌル終了するようです。