Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在sprintf()中获取附加模式_C_String_Printf - Fatal编程技术网

C 如何在sprintf()中获取附加模式

C 如何在sprintf()中获取附加模式,c,string,printf,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); } 在这里,

请参阅此代码:

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 
我有这么多这样的打印,我想添加到一个字符缓冲区中,然后我需要将其返回到应用程序中,那么如何以最简单、最快的方式获取它呢?

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 " */
inti;
chara[50];
char*ap=a;
对于(i=5;i<15;i++){
ap+=sprintf(ap,“%d”,i);
}
printf(“%s\n”,a);/*"5 6 7 8 9 10 11 12 13 14 " */

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

如果您使用的是POSIX兼容系统,请查看或:

#包括
#包括
内部主(空)
{
char buf[128]={0};
文件*fp=fmemopen(buf,sizeof(buf),“w”);
断言(fp);
fprintf(fp,“你好,世界!\n”);
fprintf(fp,“%s当然也可以工作。\n”,“格式说明符”);
fclose(fp);
put(buf);
}

这个想法是给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);
}

手动管理C==pain中的所有内容。但我告诉你,这会很快。哦,是的,很抱歉这是我的打字错误。我做的是:int offset=0;偏移量+=snprintf(ap,sizeof(ap)-偏移量,…)@Folkert:
snprintf()
假定为C99。有些人被C89卡住了。好主意。@FolkertvanHeusden,基本上是个好建议,但有一些bug。您不增加
ap
,sizeof(
ap
)是没有意义的,并且一旦偏移量增长过大,您将给
snprintf
一个负数。更好的是
offset+=snprintf(ap+offset,sizeof(a)>offset?sizeof(a)-offset:0,…)。是的,与我的问题有关。但我只想用sprintf来实现这一点。事实上,你的方式也是很好的+1@JeegarPatel我很好奇,是什么阻止你使用fprintf?它们具有完全相同的接口。
fmemopen
是由POSIX定义的,但不是由C标准定义的。在本例中,这是正确的,但如果要将缓冲区传递给附加了一些文本的函数?公平点,则至少需要一个
strlen()
调用才能找到
buffer
end。
char text[255];
text[0] = '\0';
for(int i = 0 ; i < 10 ; i++) {
    size_t offset = strlen(text);
    sprintf(&(text[offset]), "%d,", i);
}
void append(char *text, int maxSize, char *toAppend) {
  size_t offset = strlen(text);
  snprintf(&(text[offset]), maxSize, "%s", toAppend);
}