char中的可变占位符*

时间:2017-08-15 17:56:21

标签: c

我有以下C示例:

char *message;
char *name = "John";
int age = 100;

message = "Hello, I am John, age 100"; 

如何将nameage作为message中的参数?

伪代码message = "Hello, I am {name}, age {age}"

更新

我在评论中尝试了以下示例:

char *body = "{ \"capabilities\": {},\"desiredCapabilities\": {}}";
int content_length = sizeof(body);

char *format = "POST /session HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length:%d\r\n\r\n%s";
int len = snprintf(NULL, 0, format, content_length, body);
char *message = malloc(len + 1);
snprintf(message, len + 1, format, content_length, body);

但我在char *message = malloc(len + 1);收到错误:

error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]|

1 个答案:

答案 0 :(得分:4)

您可以使用snprintf执行此操作。这与printf类似,但会将结果放入字符串中,而不是将其写入stdout

char message[100];
snprintf(message, sizeof(message), "Hello, I am %s, age %d", name, age);

请注意,此示例使用固定大小的缓冲区。如果要动态分配空间,可以执行以下操作:

const char *format = "Hello, I am %s, age %d";
int len = strlen(format) + strlen(name) + sizeof(age)*3 + 1;
char *message = malloc(len);
snprintf(message, len, "Hello, I am %s, age %d", name, age);
// ...
free(message);

这为格式字符串,每个参数和终止空字节留出了空间。

获得所需长度的另一种方法是两次调用snprintf,第一次使用NULL作为字符串,0作为大小。返回值是结果字符串的长度:

const char *format = "Hello, I am %s, age %d";
int len = snprintf(NULL, 0, "Hello, I am %s, age %d", name, age);
char *message = malloc(len + 1);
snprintf(message, len + 1, "Hello, I am %s, age %d", name, age);
// ...
free(message);

关于更新代码中的错误,您显然使用的是C ++编译器而不是C编译器。如果您正在编写C,请使用C编译器。