生成一个附加其他字符串的任意大小的字符串:如何?

时间:2018-01-14 16:48:13

标签: c string append

我在动态构造一个未知大小的字符串时遇到了一些问题。试图解释我的问题我编写了这个小代码(伪C代码),每次新字符串时都应该生成一个finalstring

char *finalstring;
while (/* condition */) {
    char *tmp = get_new_string();
    finalstring = strcat(finalstring, tmp);
}
printf("%s\n", finalstring);

每次迭代get_new_string()都会得到一个我想要添加到finalstring的不同字符串。每个字符串将始终具有固定的STRSIZE,因此在每次迭代时finalstring都可以增长STRSIZE char

我怎样才能在C中真正实现这一点?我不确定malloc的使用方法......

2 个答案:

答案 0 :(得分:2)

您可以$radio(使用protected function _renderLabel($radio, $label, $input, $context, $escape) { if ($label && isset($radio['label']) ) { $label = is_array($label) ? $label : []; if (isset($label['class'])) { $radio['label'] = $this->_templates->addClass($radio['label'], $label['class']); } $label = $radio['label'] + $label; } return parent::_renderLabel($radio, $label, $input, $context, $escape); } )到reallocate获取可以连接新字符串的变量。这将为你解决问题。

realloc

对于第一个字符串,分配了一个空格来保留oldsize + new string length。连续字符串不需要覆盖以前的#include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) { char *finalstring = NULL; size_t oldsize = 0; size_t i=0; char s[][10]={"AA","BB","CC","DD"}; size_t sz = sizeof s / sizeof s[0]; while (i < sz) { size_t newsize = strlen(s[i]); size_t templen = newsize + oldsize ; if(oldsize == 0) templen++; char *temp = realloc(finalstring , templen ); if(temp == NULL){ perror("realloc failed"); exit(EXIT_FAILURE); } finalstring = temp; if(oldsize == 0){ strcpy(finalstring,s[i]); } else strcat(finalstring,s[i]); oldsize = z; i++; } printf("%s\n",finalstring ); free(finalstring); return 0; } 。而不是\0,您将使用从\0函数返回的字符串。

答案 1 :(得分:2)

  

生成一个附加其他字符串的任意大小的字符串:how?

跟踪字符串长度并根据需要重新分配新字符串。

char *final_string = NULL;
size_t final_len = 0;  // size_t is the best type for "size" math and array indexing
while (/* condition */) {
    char *tmp = get_new_string();
    size_t tmp_len = strlen(tmp);

    // Allocate enough for the length of both parts and a \0   
    char *s = realloc(final_string, final_len + tmp_len + 1);
    if (s == NULL) {
      exit(EXIT_FAILURE);
    }
    final_string = s; 

    // As code knows the strings lengths, 
    // easy enough to use fast memcpy to concatenate....
    memcpy(final_string + final_len, tmp, tmp_len + 1);
    final_len += tmp_len;
}

if (final_string) {  // If needed in case loop body never executed.
  printf("%s\n", final_string);
}
free(final_string);

这个答案没有利用&#34;每个字符串将始终是固定的STRSIZE&#34;。这是一个有利的条件。