这可能是一个非常愚蠢的问题,但是
我在int main
之外有一个结构数组typedef struct{
char c;
int k;
}factor_t;
我宣布了
factor_t *factors = malloc(INIT*sizeof(*factors));
INIT
为10
运行我的函数后,我有一个结构数组,每个结构包含一个char,c
和整数k
- 例如,factors[5].c
可以保存"b"
或"d"
或"e"
和factors[5].k
可以"3"
或"33"
或"333"
我需要以某种方式将这些插入到字符串中,但我似乎无法
strcat(destination,c or k);
他们都给我指向整数错误的指针,目的地是char*
我如何将这些放入字符串?我的目标是获得一个看起来像
的字符串ck
ck
ck
即每个结构"ck\n"
的模式,其中c
= char且k
=整数
我对strcat(destination, "\n");
使用\n
并且它有效,但我无法对c
和k
答案 0 :(得分:2)
您可以使用sprintf
来执行此操作。 -
size_t len=strlen(destination); // calculate before concatenation
sprintf(&destination[len], "%c%d\n", factors[5].c,factors[5].k); // string with newline
destination
应为char *
类型。
答案 1 :(得分:2)
计算字符串的长度并使用该偏移量输出。
#include <stdio.h>
#include <string.h>
typedef struct{
char c;
int k;
}factor_t;
void struct_cat(char *str, factor_t f) {
sprintf(str + strlen(str), "%c%d", f.c, f.k);
}
int main(void) {
factor_t fac = {'b', 33};
char buf[100] = "hogehoge";
struct_cat(buf, fac);
puts(buf);
return 0;
}
答案 2 :(得分:2)
strcat
将源字符串的副本附加到目标字符串。它期望c
为空终止字符串而不是单个char
如果要将一个char
添加到大于n
的数组中,并且空终止字符号位于索引n
destination[n] = c;
destination[n+1] = '\0;
你必须确定destination
足够大。
如果要格式化打印附加数据到目标字符串,请再次确保目标足够大并执行:
sprintf(destination + n, "%c%d\n", c, k);
或者如果您知道该目的地如何留下m
个字符:
snprintf(destination + n, m, "%c%d\n", c, k);
如果你试图打印超过m
个字符,那么额外的字符将被丢弃。
答案 3 :(得分:1)
如果您需要单独使用此功能,请使用功能(如@MikeCAT)。但是使用snprintf()
和strncat()
不允许超出数组范围:
void strncat_struct(char *buffer, size_t buffer_size, factor_t f)
{
char tmp_buf[32];
snprintf(tmp_buf, sizeof(tmp_buf), "%c, %d\n", f.c, f.k);
strncat(buffer, tmp_buf, buffer_size);
}
int32_t main(int32_t argc, char **argv)
{
//...
char buffer[256] = {0};
for(i = 0; i < INIT; i++) {
strncat_struct(buffer, sizeof(buffer), factors[i]);
}
//...
}
不使用其他功能。理论上它更快,没有必要计算字符串长度:
int32_t main(int32_t argc, char **argv)
{
//...
char buffer[256];
char *buf_ptr = buffer;
size_t buf_size = sizeof(buffer);
for(i = 0; i < INIT; i++) {
int32_t printed;
printed = snprintf(buf_ptr, buf_size, "%c, %d\n", factors[i].c, factors[i].k);
buf_ptr += printed;
buf_size -= printed;
}
//...
}