プロが教えるわが家の防犯対策術!

Perlのpushのように
あるループ内の配列にたいして任意の文字列を配列の末尾に入れることは可能なのでしょうか。

ヒープやを使えば文字列がどんな長さでも対応できるということまでは理解できたのですが
どのようなソースの書き方をすれば良いのか判りません。
出来ましたら簡単なサンプルソースを教えいただけませんでしょうか。

A 回答 (2件)

Cで無理やり書いてみました。

メモリ操作は気を使うので疲れます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int push(char ***p, char *s) {
 char **pp = *p;
 char *sp;
 int i;
 /* 初期化 */
 if (pp == NULL) {
  if ((pp=(char **)malloc(sizeof(char *))) == NULL) return -1;
  *pp = NULL;
 }
 /* 要素数 */
 for (i=0; *(pp+i)!=NULL; i++);
 /* 配列を増やす */
 if ((pp = (char **)realloc(pp, sizeof(char *)*(i+2))) == NULL) return -1;
 /* 文字列の場所を確保してコピー */
 if ((sp = (char *)malloc(sizeof(char)*(strlen(s)+1)) ) == NULL ) return -1;
 strcpy(sp, s);
 /* 配列に登録 */
 *(pp+i)=sp; i++; *(pp+i)=NULL; *p=pp;
 return i;
}

char* pop(char ***p) {
 char **pp = *p;
 char *sp;
 int i;
 /* 要素がないときはエラー */
 if (pp == NULL) return NULL;
 /* 要素数 */
 for (i=0; *(pp+i)!=NULL; i++);
 /* 最後の文字列を取り出す */
 i--; sp= *(pp+i);
 /* 配列を減らす */
 if ((pp = (char **)realloc(pp, sizeof(char *)*(i+1))) == NULL) return NULL;
 *(pp+i)=NULL; *p=pp;
 return sp;
}

void free_all(char ***p) {
 char **pp = *p;
 int i;
 /* 要素ないときは戻る */
 if ( pp == NULL ) return;
 /* すべての文字列を開放 */
 for (i=0; *(pp+i)!=NULL; i++) free(*(pp+i));
 /* 配列を開放 */
 free(pp);
 pp = NULL;
 *p = pp;
}

/* テストプログラム */
int main(void) {
 int i;
 char **p=NULL;
 char *s;
 /* push */
 push(&p, "test1"); printf("push %s\n",p[0]);
 push(&p, "test2"); printf("push %s\n",p[1]);
 push(&p, "test3"); printf("push %s\n",p[2]);
 /* pop */
 s=pop(&p); printf("pop %s\n",s);
 free(s);
 /* 領域開放 */
 free_all(&p);
 return 0;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
Cだけでやるとこんなに長くなるのですか・・・
早速、検証してみたいと思います。

お礼日時:2004/11/02 11:08

vector(可変長配列)


basic_string(可変長文字列)が
C++では標準で用意されています。
C++をつかわない場合はその仕組みを自分でつくる必要があります。


#include <string>
#include <vector>
#include <iostream>

using namespace std;


int main()
{
vector<string> vec;
vec.push_back("aaaa");
vec.push_back("bbbb");
vec.push_back("cccc");

for ( size_t s = 0 ; s < vec.size() ; s++ )
cout << vec[s] << endl;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なるほどC++ではかなり勝手が違うのですね。
参考になります。

お礼日時:2004/11/02 11:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!