- ベストアンサー
C言語の配列にPushするには
Perlのpushのように あるループ内の配列にたいして任意の文字列を配列の末尾に入れることは可能なのでしょうか。 ヒープやを使えば文字列がどんな長さでも対応できるということまでは理解できたのですが どのようなソースの書き方をすれば良いのか判りません。 出来ましたら簡単なサンプルソースを教えいただけませんでしょうか。
- みんなの回答 (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; }
その他の回答 (1)
- sha-girl
- ベストアンサー率52% (430/816)
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; }
お礼
ご回答ありがとうございます。 なるほどC++ではかなり勝手が違うのですね。 参考になります。
お礼
ご回答ありがとうございます。 Cだけでやるとこんなに長くなるのですか・・・ 早速、検証してみたいと思います。