2

私がやろうとしているのは、次のようなchar*構文を使用して新しいものを作成することですprintf:

char* myNewString = XXXXprintf("My string says %s", myFirstString);

これは、出力ストリームに出力せずに実行できますか?

4

6 に答える 6

8

sprintforsnprintf関数を探しています。

sprintf新しく割り当てられた文字列へのポインターを返さないことに注意してください。文字列を自分で割り当てる必要があり、十分な大きさであることを確認してください。

char target[100];
sprintf(target, "My string says %s", myFirstString);

ターゲットが十分に大きいと確信できない場合はsnprintf、ターゲット文字列にコピーされるバイト数を制限する を使用する必要があります。

snprintfターゲット文字列に書き込まれる文字数を返します。snprintfnull ターゲットとゼロ サイズで呼び出して、必要なバッファーの数を確認し、バッファーを割り当てて、もう一度呼び出してターゲットに書き込むことができます (: 元のコード サンプルには、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;
}

snprintf1999 ISO 標準によって C に追加されたことに注意してください。Microsoft のコンパイラはそれをサポートしていないようです。おそらく同じこと_snprintfを行う関数を呼び出します。

またasprintf、文字列を割り当てる GNU 拡張も呼び出されます。

char *target;
asprintf(&target, "My string says %s", myFirstString);

これを使用する場合、free()後で使用して文字列の割り当てを解除する必要があります。これは GNU 拡張であるため、コードの移植性が低下します。

于 2012-09-05T19:02:24.877 に答える
6

確かに、これはsprintf目的です:printf提供された へのスタイル書式設定char*

このドキュメントではsprintf、関連するprintf機能について説明します。代わりに使用することを検討してください: 適切に使用すると、提供されたバッファーに実際にコピーされるバイト数を制限するsnprintfよりも少し安全になります。sprintf

使用法はあなたの例とは少し異なります.によって変更されたバッファを提供しますsprintf. この関数は結果を返しません。他のprintf関数と同様にint、出力される文字数を返します。

char myNewString[MAX_LEN];
snprintf(myNewString, MAX_LEN, "My string says %s", myFirstString);
于 2012-09-05T19:00:28.373 に答える
1

お探しの機能はsprintf.

http://www.manpages.info/linux/sprintf.3.html

于 2012-09-05T19:00:32.103 に答える
1

GNUisms を気にしない場合は、あなたがasprintf求めているものに最も近いものかもしれません: 自動的にバッファを割り当てます (ただし、後で覚えておく必要freeがあります)。

char *target;
int ret = asprintf(&target, "My string says %s", myFirstString);
// if ret < 0, the contents of target are undefined
于 2012-09-05T19:04:34.940 に答える
0

よりsnprintfも安全ですsprintf

于 2012-09-05T19:01:54.410 に答える
-1

sprintf がそれを行うはずです。

printf との唯一の違いは、最初のパラメーターが文字列を格納する char* であることです。

sprintf(myNewString, "My string says %s", myFirstString);
于 2012-09-05T19:01:39.760 に答える