How to append strings using sprintf?
我面临sprintf的严重问题。
假设我的代码段是:
1 2 3 4 5 6 |
几百冲刺...
如果我这样做,它就会被覆盖。
如何避免使用sprintf覆盖过多。 如果我在最后给出一个printf,我想查看所有行。
你需要:
1 2 3 |
当然,您需要缓冲区足够大。
1 2 3 4 |
这是对错误有一定抵抗力的版本。如果您不关心何时会发生错误,这将很有用,只要您可以继续按照自己的喜好继续操作即可。
1 2 3 4 5 6 7 8 9 | 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()
1 2 3 4 5 6 7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
使用
1 2 3 |
当有专门针对您需要的方法(例如
我认为您正在寻找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
如果动态存储更适合您的用例,则可以遵循Liam关于使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
您是否只是在附加字符串文字?还是要追加各种数据类型(int,float等)?
将其抽象到其自己的函数中可能会更容易(以下假设为C99):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #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; } |
您将像这样使用它:
1 2 3 4 5 | char target[100] = {0}; ... appendToStr(target, sizeof target,"%s %d %f ","This is a test", 42, 3.14159); appendToStr(target, sizeof target,"blah blah blah"); |
等等
该函数从
我发现以下方法很好用。
1 2 3 |
使用strcat http://www.cplusplus.com/reference/cstring/strcat/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
您可以使用下面显示的简单行将字符串追加到一个缓冲区中:
1 |
小完整代码示例
仅使用平面stdio标准库
1 2 3 4 5 6 7 8 9 10 11 12 |
输出:我们喜欢编码
我编写了一个函数支持动态变量字符串附加,例如PHP str append:str。海峡...等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #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 ", json); if (json) free(json); return 0; } |
使用strcat(
关于什么:
1 2 3 4 5 6 7 8 9 |
但是要考虑可能的缓冲区卵流!