簡體   English   中英

在 C 中用 2 個字符包圍一個字符串

[英]Surround a string with 2 chars in C

我有一個從文件中讀取的字符串數組。 在某些時候,我需要取出一個元素,在之前添加 * 並在之后添加 *,然后將其放回同一個數組。

到目前為止,我已經設法在末尾添加一個星號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 function

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);
  }
}

如果原始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並且原始指針丟失,孤立已分配給它的 memory。 這更安全:

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

當然,如果您經常這樣做,您不妨跟蹤當前大小並一次為另外一百或一千個元素分配空間。


由於各個字符串是使用strdup()分配的,因此您有兩個選擇:

  • 為每個分配額外的 2 個字符,以防您需要添加星號。 這不是不合理的,除非有數百萬個字符串,或者系統內存受限。

  • 在添加星號之前重新分配每個字符串,使用類似上面代碼片段的代碼。

最簡單的方法是執行雙 strcat 到 go。

不過,對於這種事情,你有想過memory管理嗎? memory中你的字符串是怎么保存的?

在這一行中,您丟失了指向原始字符串的指針:

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

你有另一個對原始指針的引用嗎? 也許您想先保存它,然后重新分配相同的長度 + 2 個字符,然后放入第一個 *,復制字符串,放入最后一個 * 並刪除原始指針。

您可以將array[i] one position 中的每個字符從后面開始向右復制(到更高的索引),然后將第一個字符替換為“*”。

這假設您有足夠的空間容納兩顆額外的星星。

如果沒有,你有兩個選擇

  • 聲明/分配足夠大的原始空間(至少大兩個)或
  • malloc一個足夠大的區域,然后從索引 1 開始復制字符串,並將星星放在適當的位置 position(索引 0 和索引strlen(array[i])+1 。不要忘記重新分配array[i]中的指針array[i]之后到 malloc'd 區域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM