締切済み

:C言語でわからないところがあるのですが

  • 暇なときにでも
  • 質問No.261746
  • 閲覧数60
  • ありがとう数3
  • 気になる数0
  • 回答数9
  • コメント数0

お礼率 0% (0/10)

char a[]={
  "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",
  "ccccccccccccccccccccccccddddddddddd"
};

という変数があります。
この変数a[0]の値を,
char line[2];
に2つに分けていれたいんです。
line[0]="aaaaaaaaaaaaaaaaaaaaaaaa";

line[1]="bbbbbbbbbbbbbbbbbbbbbbbb";
というふうに。
いろいろ試しては見たのですが,ポインタがからんでくるので,フリーズしまくりながらもいろいろやっては見たのですがうまくできませんでした。
どのようにすればできるでしょうか?
通報する
  • 回答数9
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全9件)

  • 回答No.3
レベル12

ベストアンサー率 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" );
と言うようにコーディングします。
  • 回答No.2
レベル12

ベストアンサー率 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 );
補足コメント
fgrfga

お礼率 0% (0/10)

char line[2]は書きミスです。すみません。

それで,
char a[][200]={
  "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",
  "ccccccccccccccccccccccccddddddddddd"
};

この変数a[0]の値を,
char line[][200];
に2つに分けていれたいんです。
line[0]="aaaaaaaaaaaaaaaaaaaaaaaa";

line[1]="bbbbbbbbbbbbbbbbbbbbbbbb";
というふうに。
これをif文などを使って実現したいのですが。
投稿日時 - 2002-04-30 00:11:17
  • 回答No.1
レベル8

ベストアンサー率 16% (9/55)

char a[]={
  "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",
  "ccccccccccccccccccccccccddddddddddd"
};
この宣言の仕方おかしくないですか?

aは1次元配列、2次元配列?まずここを考えてみてはどうですか。
補足コメント
fgrfga

お礼率 0% (0/10)

char a[][200]={
  "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",
  "ccccccccccccccccccccccccddddddddddd"
};
でした
投稿日時 - 2002-04-29 23:17:28
  • 回答No.4
レベル12

ベストアンサー率 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)の判定で変化が有ったとき加算されるというあたりでしょうか?

こんなところで判りますか?
  • 回答No.5
レベル12

ベストアンサー率 40% (201/496)

ダブルクォーテーション(")で囲まれた文字列は、その文字列を格納したアドレスが返されます。
つまり、
buf = "abcdefg";
としたとき、abcdefgという文字列は、コンパイラによって確保された領域に格納され、buf にその先頭アドレスを入れようとします。同様に
char* a[] = {"hogehoge"};
としたときも、a[0] に "hogehoge"の先頭アドレスが格納されます。
つまり、ダブルクォーテーションで囲まれた文字列の値は「アドレス」なのです。型は char* (unsigned char* かな?)になります。

このことから、まず変数の宣言が間違っていることがわかるでしょうか?

自分で用意した変数(ご質問の a[2][200] と言う変数)に文字データを格納したい場合、C言語では、ダブルクォーテーションで囲った文字列で初期化はできません。
補足コメント
fgrfga

お礼率 0% (0/10)

えーと,ちゃんと表示とかはできているのですが,どこがおかしいんでしょうか?
a[2][200]の部分はどのようにかくほすればいいのでしょうか?

でも本では,char a[][5]={"ABCD","A","Abc"};
などと書かれていて,
for(i=0;i<3;i++){
 printf("a[%d]=%s\n",i,a[i]);
};
でちゃんと表示されますが?
投稿日時 - 2002-05-04 23:00:44
  • 回答No.8
レベル12

ベストアンサー率 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でその都度メモリを確保
しなければ行けないと思います。
  • 回答No.7
レベル13

ベストアンサー率 52% (430/816)

質問の趣旨と違ってたらごめんなさい。ただ文字列
をaがある部分ととbがある部分にわける関数です。
(間違ってたら更にごめんなさい)

void ab_wake(char *p,char *astr,char *bstr){
while (*p=='a'){
*astr=*(p++);
}
while (*p!='\0'){
*bstr=*(p++);
}
}
  • 回答No.6
レベル12

ベストアンサー率 40% (201/496)

>でちゃんと表示されますが?
本当にスイマセン。私の回答は完全に間違っていました。忘れてください。
char c[10] = "hoge" でも配列を初期化できることを確認しました(ANCI C準拠)。

#ちょっと言い訳をさせてもらうと、私が仕事で使っていたコンパイラはこの初期化を許してくれなかったんです。ANCI Cではこの初期化を規定しているので、現コンパイラでは初期化できるんですね(知らなかった^^;)。
  • 回答No.9
レベル13

ベストアンサー率 52% (430/816)

No7.の回答ですけど、すみません。おもいっきりおかしいですね。
astrもbstrもポインタが移動してない上にヌル文字を入れ忘れ・・・
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ