返回结构

时间:2015-10-16 14:32:37

标签: c arrays struct

这可能是一个非常愚蠢的问题,但是

我在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并且它有效,但我无法对ck

执行相同操作

4 个答案:

答案 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;
    }
//...
}