如何在sprintf()中获得追加模式

时间:2012-04-24 09:16:04

标签: c string printf

请参阅此代码:

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 

我想要的功能相同,我打印的内容在一个char缓冲区中。

但是使用sprintf给了我缓冲区

patel 2 

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

3 个答案:

答案 0 :(得分:22)

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 " */

确保不会导致任何缓冲区溢出。

答案 1 :(得分:3)

我们的想法是给 sprintf 指针指向缓冲区的基地址 + offset 。在你追加时,偏移量会变大。

通过使用 strlen ,可以获得当前&#39;字符串的长度。为了避免缓冲区溢出,我们可以添加额外的逻辑以检查当前是否存在&#39;串&#39; +&#39;新字符串&#39;小于缓冲区的大小。

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);
}  

答案 2 :(得分: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);
}