0

我有一个从文件中读取的字符串数组。在某些时候,我需要取出一个元素,在 * 之前和 * 之后添加并将其放回同一个数组。

到目前为止,我已经设法在末尾添加了一个星号strcat。它正在正确打印出来。现在,我如何在开头添加一个?

//malloc for the array has been done when read from file
char **array;
int arraySize;
for (i=0;i<arraySize;i++){
  if (some_condition){
    //Add * chars
    array[i]=strcat(array[i],"*");
    printf("Element %s was marked",array[i]);
  }
 //prints for example *foo*
 }

对不起,如果这个问题完全是愚蠢的,答案可能很明显。提前感谢您提供任何可能的答案!

UPD:数组malloc函数

void readd(FILE *file){
  size=0; /*local size */
  char line[BUFSIZ]; /* Local array for a single word read */

  while ((fgets(line,sizeof(line),file))!=NULL){
    /* trim newline char */
    if (line[strlen(line)-1]=='\n')
    line[strlen(line)-1] = '\0';

    array=(char**)realloc(array,(size+1)*sizeof(char *));
    array[size++]=strdup(line);
  }
}
4

3 回答 3

2

如果原始array[i]元素有足够的空间容纳附加字符:

int len = strlen(array[i]);
memmove(array[i] + 1, array[i], len); // memmove() allows overlap btwn src & dest
array[i][0] = '*';
array[i][len+2] = '\0';
array[i][len+1] = '*'

编辑:既然你已经更新了你的问题,我会更新我的答案。:-)

首先,请注意,这样使用很危险realloc()

array=(char**)realloc(array,(size+1)*sizeof(char *));

如果realloc()失败,则array重新分配给NULL然后原始指针丢失,孤立分配给它的内存。这更安全:

char **tmp = realloc(array,(size+1)*sizeof(char *));
if (tmp == NULL) {
 // Out of memory error
}
array = tmp;

当然,如果您经常这样做,您不妨跟踪当前大小,并一次为另外十万个元素分配空间。


由于分配了各个字符串,因此strdup()您有两个选择:

  • 为每个字符分配额外的 2 个字符,以防您需要添加星号。这不是不合理的,除非有数百万个字符串,或者系统内存受限。

  • 在添加星号之前重新分配每个字符串,使用上面的代码片段。

于 2012-04-10T19:13:56.610 回答
1

最简单的方法是使用双 strcat。

但是,你有没有想过这种东西的内存管理?你的字符串是如何保存在内存中的?

在这一行中,您丢失了指向原始字符串的指针:

array[i]=strcat(array[i],"*");

你对原始指针有另一个引用吗?也许你想先保存它,然后用相同的长度+2个字符重新分配,然后放第一个*,复制字符串,放最后一个*并删除原始指针。

于 2012-04-10T19:07:25.460 回答
1

array[i]您可以将每个字符从后面开始复制到右侧(到更高的索引),然后用“*”替换第一个字符。

这假设您有足够的空间来容纳两个额外的星星。

如果没有,你有两个选择

  • 声明/分配足够大的原始空间(至少两个更大)或
  • malloc一个足够大的区域,然后从索引 1 开始复制字符串并将星星放在适当的位置(索引 0 和索引strlen(array[i])+1)。不要忘记array[i]之后将指针重新分配到 malloc 的区域。
于 2012-04-10T19:07:53.717 回答