7

このコードを参照してください:

int main() {
    char a[50];
    FILE *fp;

    fp = fopen("test1.txt", "w");

    sprintf(a,"jigar %d \n", 3);
    fprintf(fp,"jigar %d \n", 3);

    sprintf(a,"patel %d \n", 2);
    fprintf(fp,"patel %d \n", 2);
    printf("%s", a);
}

ここで、 を使用してfprintf、ファイルに書き込むことができます

jigar 3 
patel 2 

どこで同じ機能が必要なのか、1つの文字バッファーに出力するものはどこにあるのか。

しかし、使用sprintfするとバッファが得られます

patel 2 

1 つの char バッファーに追加したいそのような印刷物が非常に多く、それをアプリケーションに返す必要があるため、これを最も簡単かつ最速の方法で取得するにはどうすればよいですか?

4

3 に答える 3

28

sprintf()印刷された文字数を返します。

その番号を次の書き込みに使用するだけです...

int i;
char a[50];
char *ap = a;

for (i = 5; i < 15; i++) {
    ap += sprintf(ap, "%d ", i);
}

printf("%s\n", a); /* "5 6 7 8 9 10 11 12 13 14 " */

ただし、バッファ オーバーフローが発生しないようにしてください。

于 2012-04-24T09:19:09.357 に答える
3

アイデアは、バッファのベースアドレスへのポインタ+オフセットをsprintfに与えることです。追加している間、オフセットは大きくなります。

strlenを使用すると、現在の「文字列」の長さを取得できます。バッファ オーバーフローを回避するために、現在の「文字列」+「新しい文字列」がバッファ。

size_t offset = strlen(text);
sprintf(&(text[offset]), "This is how You append using sprintf");

ループ内の例:

char text[255];
text[0] = '\0';
for(int i = 0 ; i < 10 ; i++) {
    size_t offset = strlen(text);
    sprintf(&(text[offset]), "%d,", i);
}

他のstackoverflowユーザーが提案したように、snprintfを使用することもできます。これにより、バッファオーバーフロー保護も提供されます。

追加関数は次のようになります。

void append(char *text, int maxSize, char *toAppend) {
  size_t offset = strlen(text);
  snprintf(&(text[offset]), maxSize, "%s", toAppend);
}  
于 2018-06-13T20:56:28.700 に答える
2

POSIX互換システムを使用している場合は、fmemopen(3)またはを見てくださいopen_memstream(3)

#include <assert.h>
#include <stdio.h>

int main(void)
{
    char buf[128] = { 0 };
    FILE *fp = fmemopen(buf, sizeof(buf), "w");

    assert(fp);

    fprintf(fp, "Hello World!\n");
    fprintf(fp, "%s also work, of course.\n", "Format specifiers");
    fclose(fp);

    puts(buf);
}
于 2016-02-18T12:12:57.530 に答える