- 締切済み
:C言語でわからないところがあるのですが
char a[]={ "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb", "ccccccccccccccccccccccccddddddddddd" }; という変数があります。 この変数a[0]の値を, char line[2]; に2つに分けていれたいんです。 line[0]="aaaaaaaaaaaaaaaaaaaaaaaa"; と line[1]="bbbbbbbbbbbbbbbbbbbbbbbb"; というふうに。 いろいろ試しては見たのですが,ポインタがからんでくるので,フリーズしまくりながらもいろいろやっては見たのですがうまくできませんでした。 どのようにすればできるでしょうか?
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- sha-girl
- ベストアンサー率52% (430/816)
No7.の回答ですけど、すみません。おもいっきりおかしいですね。 astrもbstrもポインタが移動してない上にヌル文字を入れ忘れ・・・
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 他の方への補足なので控えていたのですが。 >でも本では,char a[][5]={"ABCD","A","Abc"}; この場合は、コンパイラが3個の文字列群として解釈してくれます。 char a[3][5]={"ABCD","A","Abc"}; としてくれるわけです。 しかし、 char a[][5]; とした場合、1次元目がコンパイル時に確定しません。 ですから、 char a[3][5]; としなければコンパイルエラーとなります。 1次元目を固定したくない場合(可変にしたい場合)は、mallocでその都度メモリを確保 しなければ行けないと思います。
- sha-girl
- ベストアンサー率52% (430/816)
質問の趣旨と違ってたらごめんなさい。ただ文字列 をaがある部分ととbがある部分にわける関数です。 (間違ってたら更にごめんなさい) void ab_wake(char *p,char *astr,char *bstr){ while (*p=='a'){ *astr=*(p++); } while (*p!='\0'){ *bstr=*(p++); } }
- yatokesa
- ベストアンサー率40% (201/496)
>でちゃんと表示されますが? 本当にスイマセン。私の回答は完全に間違っていました。忘れてください。 char c[10] = "hoge" でも配列を初期化できることを確認しました(ANCI C準拠)。 #ちょっと言い訳をさせてもらうと、私が仕事で使っていたコンパイラはこの初期化を許してくれなかったんです。ANCI Cではこの初期化を規定しているので、現コンパイラでは初期化できるんですね(知らなかった^^;)。
- yatokesa
- ベストアンサー率40% (201/496)
ダブルクォーテーション(")で囲まれた文字列は、その文字列を格納したアドレスが返されます。 つまり、 buf = "abcdefg"; としたとき、abcdefgという文字列は、コンパイラによって確保された領域に格納され、buf にその先頭アドレスを入れようとします。同様に char* a[] = {"hogehoge"}; としたときも、a[0] に "hogehoge"の先頭アドレスが格納されます。 つまり、ダブルクォーテーションで囲まれた文字列の値は「アドレス」なのです。型は char* (unsigned char* かな?)になります。 このことから、まず変数の宣言が間違っていることがわかるでしょうか? 自分で用意した変数(ご質問の a[2][200] と言う変数)に文字データを格納したい場合、C言語では、ダブルクォーテーションで囲った文字列で初期化はできません。
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 すみません、なんとなく、学校の課題なのかと邪推して回りくどいアドバイスをしてし まいました。 もう少し、判りやすく説明し直します。(ヒントですが) >char a[][200]={ > "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb", > "ccccccccccccccccccccccccddddddddddd" >}; を、分割すると言うことは、forループなどで1バイトずつ判定していると言うことですね? (1) if( a[i] == 'a' ) のような感じでしょうか?('a'は実際は1個前の値かな?) (2) 代入は line[k][n] = a[i]; ”n”は0から199まで変化するものとします。 ”k”は(1)の判定で変化が有ったとき加算されるというあたりでしょうか? こんなところで判りますか?
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 >char line[][200]; <----(1) >に2つに分けていれたいんです。 >line[0]="aaaaaaaaaaaaaaaaaaaaaaaa"; <----(2) >と >line[1]="bbbbbbbbbbbbbbbbbbbbbbbb"; <----(2) >というふうに。 >これをif文などを使って実現したいのですが。 まず、 (1)は、コンパイルエラーになりませんか? char line[2][200]; とするべきでしょう。 それから、(2)の代入文で値を設定することはできません。 (これもコンパイルエラーになると思います) memcpy( line[0], "aaaaaaaaaaaaaaaaaaaaaaaa", 2つ目の引数のバイト数 ); とするか、 strcpy( line[0], "aaaaaaaaaaaaaaaaaaaaaaaa" ); と言うようにコーディングします。
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 >char line[2]; この宣言は2バイトの配列です。 2バイトの配列の中には >line[0]="aaaaaaaaaaaaaaaaaaaaaaaa"; >line[1]="bbbbbbbbbbbbbbbbbbbbbbbb"; 入りません。 例えば。 char line[2]; memcpy( &line[0], "12345", 5 ); memcpy( &line[1], "98765", 5 ); とした場合。 line[0]が指すアドレスから5バイトのエリアに値が複写されます。 この段階で、line[1]の値は”2”になります、また、宣言しているエリアが2バイトしかないので 別のエリアを3バイト使ってしまいます。(別のエリアを壊していると言うことです) そのあと、line[1]にまた、5バイトのエリアに値を複写することになりますから、さらに別のエリ アを壊してしまうことになります。 対策としては、line変数も2次元配列にすることだと思いますよ。 (他にも対策はありますが簡単な方法では。) 例。 char line[2][100]; memcpy( &line[0][0], "12345", 5 ); memcpy( &line[1][0], "98765", 5 );
補足
char line[2]は書きミスです。すみません。 それで, char a[][200]={ "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb", "ccccccccccccccccccccccccddddddddddd" }; この変数a[0]の値を, char line[][200]; に2つに分けていれたいんです。 line[0]="aaaaaaaaaaaaaaaaaaaaaaaa"; と line[1]="bbbbbbbbbbbbbbbbbbbbbbbb"; というふうに。 これをif文などを使って実現したいのですが。
- yusuke5111
- ベストアンサー率16% (9/55)
char a[]={ "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb", "ccccccccccccccccccccccccddddddddddd" }; この宣言の仕方おかしくないですか? aは1次元配列、2次元配列?まずここを考えてみてはどうですか。
補足
char a[][200]={ "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb", "ccccccccccccccccccccccccddddddddddd" }; でした
補足
えーと,ちゃんと表示とかはできているのですが,どこがおかしいんでしょうか? a[2][200]の部分はどのようにかくほすればいいのでしょうか? でも本では,char a[][5]={"ABCD","A","Abc"}; などと書かれていて, for(i=0;i<3;i++){ printf("a[%d]=%s\n",i,a[i]); }; でちゃんと表示されますが?