C でヌル スペースの末尾のない sprintf()

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) は常にヌル終了するようです。