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 

我想要的相同功能在哪里我打印的任何东西都放在一个字符缓冲区中。

但是使用sprintf给了我缓冲

patel 2 

我有这么多这样的打印,我想在一个字符缓冲区中添加,然后我需要将它返回给应用程序,那么如何以最简单和最快的方式获得它呢?

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)or 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 回答