如何使用sprintf附加string?

我正面临着sprintf的严重问题。

假设我的代码片段是:

sprintf(Buffer,"Hello World"); sprintf(Buffer,"Good Morning"); sprintf(Buffer,"Good Afternoon"); . . . 

一些冲刺…

如果我这样做,它会被覆盖。

我怎样才能避免使用sprintf覆盖。 如果我在最后给出一个printf,我想看看所有的行。

你需要:

 sprintf(Buffer,"Hello World"); sprintf(Buffer + strlen(Buffer),"Good Morning"); sprintf(Buffer + strlen(Buffer),"Good Afternoon"); 

当然你需要你的缓冲区足够大。

 int length = 0; length += sprintf(Buffer+length, "Hello World"); length += sprintf(Buffer+length, "Good Morning"); length += sprintf(Buffer+length, "Good Afternoon"); 

这里是一些对错误有抵触的版本。 如果你不在乎什么时候发生错误,只要你可以继续沿着你的快乐的方式,这是有用的。

 int bytes_added( int result_of_sprintf ) { return (result_of_sprintf > 0) ? result_of_sprintf : 0; } int length = 0; length += bytes_added(sprintf(Buffer+length, "Hello World")); length += bytes_added(sprintf(Buffer+length, "Good Morning")); length += bytes_added(sprintf(Buffer+length, "Good Afternoon")); 

为了安全(缓冲区溢出),我推荐使用snprintf()

 const int MAX_BUF = 1000;
 char * Buffer = malloc(MAX_BUF);

 int length = 0;
 length + = snprintf(Buffer + length,MAX_BUF-length,“Hello World”);
 length + = snprintf(Buffer + length,MAX_BUF-length,“早上好”);
 length + = snprintf(Buffer + length,MAX_BUF-length,“Good Afternoon”);

snprintfcat()snprintfcat()包装器:

 size_t snprintfcat( char* buf, size_t bufSize, char const* fmt, ...) { size_t result; va_list args; size_t len = strnlen( buf, bufSize); va_start( args, fmt); result = vsnprintf( buf + len, bufSize - len, fmt, args); va_end( args); return result + len; } 

为什么你要使用sprintf进行string连接时,有专门为你所需要的方法,如strcatstrncat

我发现以下方法很好地工作。

 sprintf(Buffer,"Hello World"); sprintf(&Buffer[strlen[Buffer]],"Good Morning"); sprintf(&Buffer[strlen[Buffer]],"Good Afternoon"); 

你只是附加string文字? 或者你将要追加各种数据types(整数,浮点数等)?

把它抽象成它自己的函数可能更容易(下面假设C99):

 #include <stdio.h> #include <stdarg.h> #include <string.h> int appendToStr(char *target, size_t targetSize, const char * restrict format, ...) { va_list args; char temp[targetSize]; int result; va_start(args, format); result = vsnprintf(temp, targetSize, format, args); if (result != EOF) { if (strlen(temp) + strlen(target) > targetSize) { fprintf(stderr, "appendToStr: target buffer not large enough to hold additional string"); return 0; } strcat(target, temp); } va_end(args); return result; } 

你会这样使用它:

 char target[100] = {0}; ... appendToStr(target, sizeof target, "%s %d %f\n", "This is a test", 42, 3.14159); appendToStr(target, sizeof target, "blah blah blah"); 

等等

该函数返回来自vsprintf的值,在大多数实现中这是写入目标的字节数。 这个实现中有一些漏洞,但它应该给你一些想法。

使用sprintf()的返回值

 Buffer += sprintf(Buffer,"Hello World"); Buffer += sprintf(Buffer,"Good Morning"); Buffer += sprintf(Buffer,"Good Afternoon"); 

我想你正在寻找fmemopen(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); return 0; } 

如果dynamic存储更适合您的使用情况,您可以按照Liam关于使用open_memstream(3)的出色build议:

 #include <assert.h> #include <stdio.h> #include <stdlib.h> int main(void) { char *buf; size_t size; FILE *fp = open_memstream(&buf, &size); assert(fp); fprintf(fp, "Hello World!\n"); fprintf(fp, "%s also work, of course.\n", "Format specifiers"); fclose(fp); puts(buf); free(buf); return 0; } 

您可以使用下面显示的简单行来在一个缓冲区中附加string:

 sprintf(Buffer,"%s %s %s","Hello World","Good Morning","Good Afternoon"); 

使用strcat http://www.cplusplus.com/reference/cstring/strcat/

 int main () { char str[80]; strcpy (str,"these "); strcat (str,"strings "); strcat (str,"are "); strcat (str,"concatenated."); puts (str); return 0; } Output: these strings are concatenated. 

我写了一个函数支持dynamicvariablesstring append,就像PHP str append:str一样。 str。 …等

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> int str_append(char **json, const char *format, ...) { char *str = NULL; char *old_json = NULL, *new_json = NULL; va_list arg_ptr; va_start(arg_ptr, format); vasprintf(&str, format, arg_ptr); // save old json asprintf(&old_json, "%s", (*json == NULL ? "" : *json)); // calloc new json memory new_json = (char *)calloc(strlen(old_json) + strlen(str) + 1, sizeof(char)); strcat(new_json, old_json); strcat(new_json, str); if (*json) free(*json); *json = new_json; free(old_json); free(str); return 0; } int main(int argc, char *argv[]) { char *json = NULL; /* str_append(&json, "name: %d, %d, %d", 1, 2, 3); str_append(&json, "sex: %s", "male"); str_append(&json, "end"); str_append(&json, ""); str_append(&json, "{\"ret\":true}"); */ int i; for (i = 0; i < 100; i++) { str_append(&json, "id-%d", i); } printf("%s\n", json); if (json) free(json); return 0; } 

使用strcat ( buffer ,“ Your new string...here ”)作为选项。

关于什么:

 char s[100] = ""; sprintf(s, "%s%s", s, "s1"); sprintf(s, "%s%s", s, "s2"); sprintf(s, "%s%s", s, "s3"); printf("%s", s); 

但考虑到可能的缓冲区过度!