私がやろうとしているのは、次のようなchar*
構文を使用して新しいものを作成することですprintf
:
char* myNewString = XXXXprintf("My string says %s", myFirstString);
これは、出力ストリームに出力せずに実行できますか?
sprintf
orsnprintf
関数を探しています。
sprintf
新しく割り当てられた文字列へのポインターを返さないことに注意してください。文字列を自分で割り当てる必要があり、十分な大きさであることを確認してください。
char target[100];
sprintf(target, "My string says %s", myFirstString);
ターゲットが十分に大きいと確信できない場合はsnprintf
、ターゲット文字列にコピーされるバイト数を制限する を使用する必要があります。
snprintf
ターゲット文字列に書き込まれる文字数を返します。snprintf
null ターゲットとゼロ サイズで呼び出して、必要なバッファーの数を確認し、バッファーを割り当てて、もう一度呼び出してターゲットに書き込むことができます (注: 元のコード サンプルには、off-by-one エラーがありました。 )
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *myFirstString = "hello, world";
char *target;
size_t size = snprintf(NULL, 0, "My string says %s", myFirstString);
target = malloc(size+1); /* +1 for terminating '\0' */
if (target == NULL) {
fprintf(stderr, "Allocation failed\n");
exit(EXIT_FAILURE);
}
size = snprintf(target, size+1, "My string says %s", myFirstString);
printf("target = \"%s\"\n", target);
return 0;
}
snprintf
1999 ISO 標準によって C に追加されたことに注意してください。Microsoft のコンパイラはそれをサポートしていないようです。おそらく同じこと_snprintf
を行う関数を呼び出します。
またasprintf
、文字列を割り当てる GNU 拡張も呼び出されます。
char *target;
asprintf(&target, "My string says %s", myFirstString);
これを使用する場合、free()
後で使用して文字列の割り当てを解除する必要があります。これは GNU 拡張であるため、コードの移植性が低下します。
確かに、これはsprintf
目的です:printf
提供された へのスタイル書式設定char*
。
このドキュメントではsprintf
、関連するprintf
機能について説明します。代わりに使用することを検討してください: 適切に使用すると、提供されたバッファーに実際にコピーされるバイト数を制限するsnprintf
よりも少し安全になります。sprintf
使用法はあなたの例とは少し異なります.によって変更されたバッファを提供しますsprintf
. この関数は結果を返しません。他のprintf
関数と同様にint
、出力される文字数を返します。
char myNewString[MAX_LEN];
snprintf(myNewString, MAX_LEN, "My string says %s", myFirstString);
お探しの機能はsprintf
.
GNUisms を気にしない場合は、あなたがasprintf
求めているものに最も近いものかもしれません: 自動的にバッファを割り当てます (ただし、後で覚えておく必要free
があります)。
char *target;
int ret = asprintf(&target, "My string says %s", myFirstString);
// if ret < 0, the contents of target are undefined
よりsnprintf
も安全ですsprintf
。
sprintf がそれを行うはずです。
printf との唯一の違いは、最初のパラメーターが文字列を格納する char* であることです。
sprintf(myNewString, "My string says %s", myFirstString);