• ベストアンサー

new演算子

1:new演算子は2次元配列はつくれますか?? 2:new演算子で配列を動的に生成して以下の文字を代  入したい場合はどうすればいいですか?    char* a = new char[3]; a[] = {"ABC" "EFG" "HIJ"}    上のプログラムだと、a[0]にABCの文字が入りませ  ん。どうすれば、a[0]にABCを格納できますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • o_jiji
  • ベストアンサー率50% (1/2)
回答No.4

stringを使った例です。 charの配列と違って=で代入出来て、文字列の最大長を意識しなくて済みます。 しかしcharの配列で済むなら、その方がシンプルで処理が高速になります。 // // To compile // CL -GX StrTest.cpp // #include <iostream.h> #include <string> using namespace std; int main(void) { int i; string *str; str = new string[3]; str[0] = "ABC"; str[1] = "DEF"; str[2] = "GHI"; for(i=0; i<3; i++) cout << str[i].c_str() << endl; delete[] str; return 0; }

その他の回答 (3)

noname#15691
noname#15691
回答No.3

こんな方法もあります。 char (*a)[4] = new char[3][4]; strcpy(a[0], "ABC"); strcpy(a[1], "EFG"); strcpy(a[2], "HIJ"); 解放は、 delete [] a;

  • o_jiji
  • ベストアンサー率50% (1/2)
回答No.2

2次元配列は可能ですが、文字列のサイズを決めておきます。 下の例では、\0を含めた4バイトのcharの配列を3個確保します。 int i; char (*str)[4]; str = new char[3][4]; strcpy(str[0],"ABC"); strcpy(str[1],"DEF"); strcpy(str[2],"GHI"); for(i=0; i<3; i++) cout << str[i] << endl; delete[] str; stringを使う方が便利ですね。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

1. int **a= new int*[2]; a[0]=new int[3]; a[1]=new int[3]; みたいな感じで2段階でやればいいかと 2. char** a = new char*[3]; a[0]="ABC"; a[1]="EFG"; a[2]="HIJ"; って感じですか stringを使った方が何かと便利です stringの場合 string *a = new string[3]; a[0]=string("ABC"); a[1]=string("EFG"); a[2]=string("HIJ"); とか

関連するQ&A

  • new charとnew char[N]の違いは?

    こんにちは。 C++言語において、動的なメモリの割り当てを行うために、new演算子がありますが、 char *p; p=new char; とした場合と、 char *p; p=new char[80]; とした場合、何が異なるのでしょうか? pに1次元配列を割り当てる場合は、後者の方が正しいと思うのですが、 どちらの場合も、pはchar型の1次元配列として扱う事ができました。 ただ、それはたまたまだったのかもしれないので、きちんと理解しておきたいと思います。 何か御存じの方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • 動的配列を宣言するためにnew演算子とdelete演算子を用いる方法が

    動的配列を宣言するためにnew演算子とdelete演算子を用いる方法があります。 2次元配列は以下のように宣言して作れるのは分かったのですが、 (実際に使って動かしてみました。) int **pp; pp = new int*[ROW]; // 行を作る for(int i = 0; i < ROW; i++) // 列を作る pp[i] = new int[COL]; http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section02/section02_07.html(引用) 3次元配列をどのように作ったらいいか分かりません。 教えてください。宜しくお願いします。

  • new演算子と初期化子 { } の違いについて教えて下さい

    演算子と初期化子 { } の違いがわからなくて調べています。 // newを使った配列 int[] a = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; // { } を使った配列 int[] a = { 1, 2, 3 }; /* 上記の例は配列ですが、 例えば、配列ではない、Kamokuというクラスを作ったときに、 { } でコンストラクタを使用して、インスタンスを作ることは不可能ですか?メモリは確保しないのでしょうか?

    • ベストアンサー
    • Java
  • C++ の new演算子について

    C++ の new演算子について質問です。 new演算子を用いてクラスのインスタンスを作ったときに、 クラスのメンバー関数内で使用される自動変数はメモリの何処に割り付けられますか? 以下の回答の内のいずれかと想定しています。 ・ヒープ領域 ・スタック領域 たとえば、以下のように、クラスTestClassが定義されていたとします。 class TestClass { int x; // int型(4byteとする) char y; // char型(1byte) long z; // long型(4byte) void play(short); } void main(void){ TestClass* pt = new a(); play(10); } void TestClass:: play(short n){ char a; long b; static c; for(int a = 0; a < 10; a++ ){ b = n * a; cout << b; } } main関数内で、インスタンスを作成した時点で ・TestClassのデータメンバx,y,z ⇒ ヒープ領域に確保(4+1+4 = 9byte。もしかしたらアライメント     の関係で もう少し大きく領域を確保するかも) ・play関数で使われる変数n,a,bの領域は何処に確保されるのでしょうか? 変数cは静的変数用領域に保存される? new演算子で作ったインスタンスはdelete演算子を使わないと消えないと勉強しました。(OSが消さない限り) つまり、上記ではmain関数を抜けても、変数x,y,z,n,a,bの実体は残ると考えてよいのでしょうか? そう考えると、n,a,bの実体はスタックではなく、ヒープ領域に確保する気がします、、 どうか、ご教授ください。

  • 文字列のswap

    文字列をswapするプログラムを作りたいと思っています。 やってみると、最初の一文字しかswapされません。 どうしてこれではいけないのでしょうか? よろしくお願いします。 以下が作ったプログラムです。 #include<stdio.h> void swap(char *a,char *b); int main() { char a[2][5]={"abc","efg"}; printf("befor a[0]:%s a[1]:%s?n",a[0],a[1]); swap(&a[0],&a[1]); printf("after a[0]:%s a[1]:%s?n",a[0],a[1]); } void swap(char *a,char *b) { char *tmp; tmp=*a; *a=*b; *b=tmp; } 実行結果は befor a[0]:abc a[1]:efg after a[0]:ebc a[1]:afg となります。 befor a[0]:abc a[1]:efg after a[0]:efg a[1]:abc となって欲しいです。

  • new演算子でメモリを確保したが、値が格納されなかった配列の…

    new演算子でメモリを確保したが、 値が格納されなかった配列の判別方法は ありますでしょうか? int i; int* a; a = new int[5]; a[0] = 0; a[1] = 1; a[5] = 5; //0,1,5のみ表示させたい for (i = 0; i < 6; i++) { if (?????) cout << a[i] << endl; }

  • 演算対象の数字と演算子を入力して計算させる

    数字と演算子をそれぞれ入力し、優先順位の高い順に四則演算させるにはどのような考え方をすればよいのでしょうか。 数字をa[7]とおいて、演算子をop[7]としてそれぞれ配列に格納しましたが、そこから先に進めません。 オペランドと演算子の組み合わせならば優先順に計算してくれるのはわかっていますが、オペランドと演算子を格納した配列では上手く行きません。 実は既に全ての演算子の組み合わせをIfで表示させるプログラムを根性で作ったのですが、最適解を知りたいです。 言語はCでvisualstudioを使っております。 条件はn回数字を入力したらn-1回演算子を入力し、n回目に=を入力する。nの最大値は7とする。です。 だらだらと見辛い文章で申し訳ありませんが、何卒宜しくお願いします。

  • C言語について教えてください。

    二次元配列でまとめられた「配列で実現する文字列」の文字と文字列を表示する関数を定義し、その関数の機能を確認するプログラムを作成する。 ただし、以下の例のように文字列の個数が変更されても処理できる関数を作成する。 また、文字列の文字の個数は最大9とする(一次元配列の要素数は10とする) さらに、関数printf()をできるだけ用いない。 (1)二次元配列でまとめられたすべての文字列を「一度に」表示する関数を定義する (2)二次元配列でまとめられたすべての文字列の文字を「一度に」表示する関数を定義する。このとき、前回の課題で定義した「すべての文字を表示する関数print_all_char()」を新しく定義する関数から呼び出して用いる。 (3)二次元配列に各文字列を格納してまとめるとき、初期化ではなく、配列の宣言・定義の後で、関数strcpy()を用いること(例では、初期化によりまとめている) [例] char astr[][10] = { "ABCD", "EFGHIJ", }; [実行結果の例] すべての文字列の表示 ABCD EFGHIJ すべての文字列の文字の表示 A B C D E F G H I J [ヒント] (1)二次元配列でまとめられた文字列の文字あるいは文字列を表示する関数<返却値型><関数名>(二次元配列の受け渡しに対応した仮引数の宣言、文字列の数) (2)文字列の数を求める。二次元配列のすべての要素に文字列が格納されている場合、文字列の数=二次元配列の要素数(一次元配列の数) =sizeof(astr)/sizeof(astr[0]) ただし、sizeof演算子の生成する型はsize_t型である。 この問題について教えてください。問題丸投げだとは分かっていますがどうしても分かりません。教えてください。ちなみに前回の課題の定義は下の通りです。 void print_all_char(char *chs) { while(*chs!='\0') { printf("%c\n",*chs); chs++; } } よろしくお願いします。

  • 文字列の切り出し

    文字列"abc.bcd.efg.hij"などから 最後のドットの前まで(例の場合"abc.bcd.efg"の部分) を切り出したいです。 どうすればよいかアイデアが出てきません。 ヒントだけでもいいので教えて下さい。 お願いします。

  • C++のnew演算子について質問です。

    C++のnew演算子について質問です。 以下は関数にポインタを渡して値を得ようしたプログラムです。 ※ディレクティブは省略しています。 void test( int* a ) { a = new int( 100 ); } void main() { int* b; test(b); printf( "%d", *b ); delete b; b = NULL; } このプログラムを実行すると、コンソール画面には100と表示されるかと思っていたのですが、 実際には滅茶苦茶な値と、例外が発生して強制終了しました。 また、関数に渡したポインタのアドレスもNULLとなってしまいます。 そこで以下のようにソースを変更すると正常に100が表示されました。 void test( int** a ) { *a = new int( 100 ); } void main() { int* b; test(&b); printf( "%d", *b ); delete b; b = NULL; } 結果的には目的が達成できたのでいいのですが、なぜこのような動作をするのかが いまいち釈然としません。 new演算子は自動的には破棄されないのではないのでしょうか? 回答の程、よろしくお願いします。