在C中用2个字符包围一个字符串

时间:2012-04-10 18:58:44

标签: c string append strcat

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

到目前为止,我已设法在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);
  }
}

3 个答案:

答案 0 :(得分: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个字符,以防您需要添加星号。除非有数百万字符串,或系统受内存限制,否则这并非不合理。

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

答案 1 :(得分:1)

最简单的方法是做一个双重strcat。

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

在此行中,您将丢失指向原始字符串的指针:

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

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

答案 2 :(得分:1)

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

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

如果没有,您有两个选择

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