0

ファイルから読み取った文字列の配列があります。ある時点で、1 つの要素を取り出し、* の前後に * を追加して、同じ配列に戻す必要があります。

これまでのところ、最後にアスタリスクを 1 つ追加することができました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;

もちろん、これを頻繁に行う場合は、現在のサイズを追跡し、一度に別の 100 または 1000 要素用のスペースを割り当てることもできます。


個々の文字列が割り当てられるため、次のstrdup()2 つのオプションがあります。

  • アスタリスクを追加する必要がある場合に備えて、それぞれに追加の 2 文字を割り当てます。これは、何百万もの文字列があるか、システムがメモリに制約されていない限り、不合理ではありません。

  • 上記のスニペットのようなコードを使用して、アスタリスクを追加する前に各文字列を再割り当てします。

于 2012-04-10T19:13:56.610 に答える
1

最も簡単な方法は、二重の strcat を実行することです。

しかし、この種のメモリ管理について考えたことはありますか? 文字列はどのようにメモリに保存されますか?

この行では、元の文字列へのポインターを失います。

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

元のポインターへの別の参照がありますか? 最初に保存してから、同じ長さ + 2 文字で再割り当てし、最初の * を入れて文字列をコピーし、最後の * を入れて元のポインターを削除したい場合があります。

于 2012-04-10T19:07:25.460 に答える
1

1 つの位置にあるすべての文字をarray[i]右に (より高いインデックスに) 後方から先頭に向かってコピーし、最初の文字を「*」に置き換えることができます。

これは、追加の 2 つの星を保持するのに十分なスペースがあることを前提としています。

そうでない場合は、2 つの選択肢があります

  • 十分な大きさの元のスペースを宣言/割り当てます (少なくとも 2 つ大きい) または
  • malloc十分な大きさの領域を作成し、インデックス 1 から始まる文字列をコピーして、星を適切な位置 (インデックス 0 および index ) に配置します。後で malloc された領域にstrlen(array[i])+1ポインターを再割り当てすることを忘れないでください。array[i]
于 2012-04-10T19:07:53.717 に答える