我在动态构造一个未知大小的字符串时遇到了一些问题。试图解释我的问题我编写了这个小代码(伪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
的使用方法......
答案 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;。这是一个有利的条件。