C - 将字符串追加到分配的内存结束

时间:2014-07-25 14:00:27

标签: c string memory append concatenation

让我们考虑以下代码:

int len = 100;
char *buf = (char*)malloc(sizeof(char)*len);
printf("Appended: %s\n",struct_to_string(some_struct,buf,len));

有人分配了大量内存以使其填充字符串数据。问题是从some_struct获取的字符串数据可能是任何长度。所以我想要实现的是使struct_to_string函数执行以下操作:

  1. 不要分配任何外出的内存(因此,必须在函数外部分配buf并传递)
  2. 在struct_to_string中我想做类似的事情:

    char* struct_to_string(const struct type* some_struct, char* buf, int len) {
    
    //it will be more like pseudo code to show the idea :) 
    
    
    char var1_name[] = "int l1";
    buf += var1_name + " = " + some_struct->l1; 
    //when l1 is a int or some non char, I need to cast it 
    
    char var2_name[] = "bool t1";
    buf += var2_name + " = " + some_struct->t1; 
    
    // buf+= (I mean appending function) should check if there is a place in a buf,
    //if there is not it should fill buf with
    //as many characters as possible (without writting to memory) and stop
    //etc.
    
    return buf;
    }
    
  3. 输出应该是:

    Appended: int l1 = 10 bool t1 = 20  //if there was good amount of memory allocated or
    ex: Appended: int l1 = 10 bo //if there was not enough memory allocated
    

    总结一下:

    1. 我需要一个函数(或几个函数),它将给定的字符串添加到基本字符串而不会覆盖基本字符串;
    2. 基本字符串内存已满时不执行任何操作
    3. 我不能使用C ++库
    4. 我可以问的另一件事,但现在不是那么重要:

      1. 有没有办法(在C中)迭代结构变量列表来获取它们的名字,或者至少在没有它们名字的情况下得到它们的值? (例如,通过数组迭代结构; d)
      2. 我通常不使用C,但现在我有义务这样做,所以我有非常基本的知识。 (对不起我的英文)

        编辑:

        解决该问题的好方法如下所示:stackoverflow.com/a/2674354/2630520

2 个答案:

答案 0 :(得分:0)

我说你需要的只是string.h标题中定义的标准strncat函数。

关于'迭代结构变量列表' 部分,我不完全确定你的意思。如果你谈论迭代结构的成员,一个简短的答案是:你不能免费反省C结构。

您需要事先知道您正在使用的结构类型,以便编译器知道内存中的 offset ,它可以找到结构的每个成员。否则,它只是一个像其他任何字节一样的字节数组。

不要在意我是否不够清楚,或者是否需要更多细节。 祝你好运。

答案 1 :(得分:0)

所以我基本上就像这样做了:stackoverflow.com/a/2674354/2630520

int struct_to_string(const struct struct_type* struct_var, char* buf, const int len)
{
    unsigned int length = 0;
    unsigned int i;

    length += snprintf(buf+length, len-length, "v0[%d]",  struct_var->v0);
    length += other_struct_to_string(struct_var->sub, buf+length, len-length);
    length += snprintf(buf+length, len-length, "v2[%d]", struct_var->v2);
    length += snprintf(buf+length, len-length, "v3[%d]", struct_var->v3);
    ....

    return length;
}

snprintf尽可能多地写入并丢弃剩下的所有内容,这正是我所寻找的。