基于旧数组malloc,realloc向新数组添加新字符

时间:2012-03-15 00:59:00

标签: c arrays char malloc realloc

我在这个网站上问了一个问题并且使用伪代码得到了解答,但我仍然无法弄清楚如何正确解决这个问题

基本上我传递一个字符数组,并且用户选择的数字与要添加到数组的新字符数相关。我想创建一个新数组,其中size =旧数组+要添加的新字符数,提示用户输入新字符,然后将其添加到新数组(重新分配旧字符)。我不知道该怎么做!而且很沮丧。

char * add(char * array, int num)
{
 /* malloc new_size bytes and assign to new_array
memcpy old_size bytes from old_array into the new_array
add additions into new_array starting from (new_array+old_size)
free the old_araray
return new_array; 
*/

}  

1 个答案:

答案 0 :(得分:2)

你标记了“realloc”这个问题,所以大概是你知道realloc()函数。使用它而不是malloc()memcpy()free()

更简单,也可能更有效率

但是,我在这里看不到的是函数如何知道“旧”数组的大小。它是一个以null结尾的字符串吗?如果没有,你需要传递另一个整数,说明现有数组的大小。

假设它是一个以null结尾的字符串,你可以这样做:

char *add(char *string, int num) {
  // Note, these represent the length *without* the null terminator...
  int old_length = strlen(string);
  int new_length = old_length + num;

  // ...so we add 1 here to make room for the null.
  string = realloc(string, new_length + 1);  // Error checking omitted

  for (int n = old_length; n < new_length; n += 1) {
    // Prompt for the new characters; here I'll just assume they're all 'X'.
    char new_char = 'X';

    string[n] = new_char;
  }

  string[new_length] = '\0';

  return string;
}

如果它不是以空字符结尾的字符串,则您将传递old_length作为参数,而不是使用strlen()确定它,不要在realloc()调用中添加1,并且最后不要将string[new_length]设置为null。其余的保持不变。