• 締切済み

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

char a[]={   "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",   "ccccccccccccccccccccccccddddddddddd" }; という変数があります。 この変数a[0]の値を, char line[2]; に2つに分けていれたいんです。 line[0]="aaaaaaaaaaaaaaaaaaaaaaaa"; と line[1]="bbbbbbbbbbbbbbbbbbbbbbbb"; というふうに。 いろいろ試しては見たのですが,ポインタがからんでくるので,フリーズしまくりながらもいろいろやっては見たのですがうまくできませんでした。 どのようにすればできるでしょうか?

みんなの回答

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.9

No7.の回答ですけど、すみません。おもいっきりおかしいですね。 astrもbstrもポインタが移動してない上にヌル文字を入れ忘れ・・・

  • itohh
  • ベストアンサー率45% (210/459)
回答No.8

こんにちは。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)
回答No.7

質問の趣旨と違ってたらごめんなさい。ただ文字列 を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)
回答No.6

>でちゃんと表示されますが? 本当にスイマセン。私の回答は完全に間違っていました。忘れてください。 char c[10] = "hoge" でも配列を初期化できることを確認しました(ANCI C準拠)。 #ちょっと言い訳をさせてもらうと、私が仕事で使っていたコンパイラはこの初期化を許してくれなかったんです。ANCI Cではこの初期化を規定しているので、現コンパイラでは初期化できるんですね(知らなかった^^;)。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.5

ダブルクォーテーション(")で囲まれた文字列は、その文字列を格納したアドレスが返されます。 つまり、 buf = "abcdefg"; としたとき、abcdefgという文字列は、コンパイラによって確保された領域に格納され、buf にその先頭アドレスを入れようとします。同様に char* a[] = {"hogehoge"}; としたときも、a[0] に "hogehoge"の先頭アドレスが格納されます。 つまり、ダブルクォーテーションで囲まれた文字列の値は「アドレス」なのです。型は char* (unsigned char* かな?)になります。 このことから、まず変数の宣言が間違っていることがわかるでしょうか? 自分で用意した変数(ご質問の a[2][200] と言う変数)に文字データを格納したい場合、C言語では、ダブルクォーテーションで囲った文字列で初期化はできません。

fgrfga
質問者

補足

えーと,ちゃんと表示とかはできているのですが,どこがおかしいんでしょうか? a[2][200]の部分はどのようにかくほすればいいのでしょうか? でも本では,char a[][5]={"ABCD","A","Abc"}; などと書かれていて, for(i=0;i<3;i++){  printf("a[%d]=%s\n",i,a[i]); }; でちゃんと表示されますが?

  • itohh
  • ベストアンサー率45% (210/459)
回答No.4

こんにちは。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)
回答No.3

こんにちは。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)
回答No.2

こんにちは。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
質問者

補足

char line[2]は書きミスです。すみません。 それで, char a[][200]={   "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",   "ccccccccccccccccccccccccddddddddddd" }; この変数a[0]の値を, char line[][200]; に2つに分けていれたいんです。 line[0]="aaaaaaaaaaaaaaaaaaaaaaaa"; と line[1]="bbbbbbbbbbbbbbbbbbbbbbbb"; というふうに。 これをif文などを使って実現したいのですが。

回答No.1

char a[]={   "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",   "ccccccccccccccccccccccccddddddddddd" }; この宣言の仕方おかしくないですか? aは1次元配列、2次元配列?まずここを考えてみてはどうですか。

fgrfga
質問者

補足

char a[][200]={   "aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbb",   "ccccccccccccccccccccccccddddddddddd" }; でした

関連するQ&A

  • 変数操作(C言語)

    C言語でプログラムを書いてます。 char1[0]:1 char1[1]:5   ↓ char2[0]:1 char2[1]:NULL char2[2]:NULL char2[3]:NULL char2[4]:5 char2[5]:NULL という風に値の順番と配列の順番を別の変数で一緒にしたいのです。1から5までの値はNULL、また5以降はNULLといったように値を格納したいのです。 こういったロジックの組み方のご教授願います。 また値が2、4でも対応できるような(どんな数でも)ものでお願いします。(↓例) char1[0]:2 char1[1]:4   ↓ char2[0]:NULL char2[1]:2 char2[2]:NULL char2[3]:4 char2[4]:NULL char2[5]:NULL よろしくお願い致します。

  • c言語で定義する変数のアドレス

    c言語の超初心者です。追いえてください。 c言語で2つの変数を定義しています。 char *a; char *b; この2つの変数に値をいれた際の動作で以下のようなことって発生しますか? a="1111" b="2222" aをprintfするとbにいれた値"2222"が表示される。

  • C言語の変数について

    C言語の変数について教えていただきたいです。 C言語で下記のような設定をした場合、変数A、Bに設定する値にはバイト数制限 はないのでしょうか? バイト数制限がなくなる場合、なぜそうなるのかを教えていただきたいです。 よろしくお願いします。 #include <stdio.h> void test( char **B); int main( int argc, char *argv[] ) { char *A = NULL; char *B = NULL; A = argv[1]; test( B ); return 0; } void test( char **B ) { strcpy(B, "ABCD"); return 0; }

  • C言語 どこがコンパイルエラーか解りません。

    いつも大変お世話になっております。 標記の件。 どこがエラーなのか解りません。 2時間くらい、にらめっこが続いています。 どこがエラーなのか教えて下さい。 ご回答のほどよろしくお願い申し上げます。 コード #include <stdio.h> int a = 0; void func(void) { int c = 2; printf("func関数では変数aとcが使えます。¥n”); printf("変数aの値は%dです。\n",a); /*printf("変数bの値は%dです。\n",b);*/ printf("変数cの値は%dです。\n",c); } int main(void) { int b = 1; printf("main関数では変数aとbが使えます。\n"); printf("変数aの値は%dです。\n", a); printf("変数bの値は%dです。\n", b); /*printf("変数cの値は%dです。\n", c); */ func(); return 0; } コンパイルエラー printf("func関数では変数aとcが使えます。¥n”); ^ text10.c:9:8: error: missing terminating " character printf("func関数では変数aとcが使えます。¥n”); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text10.c:10:34: error: expected ')' before ';' token printf("変数aの値は%dです。\n",a); ^ text10.c:10:1: warning: passing argument 1 of 'printf' makes pointer from integer without a cast [-Wint-conversion] printf("変数aの値は%dです。\n",a); ^~~~~~ In file included from text10.c:1:0: c:\mingw\include\stdio.h:454:38: note: expected 'const char *' but argument is of type 'int' _CRTIMP __cdecl __MINGW_NOTHROW int printf (const char *, ...); ^~~~~~ text10.c:13:1: error: expected ';' before '}' token } どうかよろしくお願いいたします。

  • C言語 変換指定%sについてです。

    現場での経験もあるPGなのですが、C言語の基礎を復習していたら疑問に思うことが出てきてしまったので、質問させて下さい。 printf関数などに使われる変換指定%sについてですが、 char word[] = "test"; char *pointer; pointer = word; とした場合、pointerの値は文字列wordの先頭アドレスになるので、 printf ("%x", pointer); とすれば、そのアドレス値が表示されるのはとてもよくわかるのですが、 printf ("%s", pointer); とした場合に、"test"と表示されるのがイマイチ納得できないんです。 printf ("%s", *pointer); なら、まだわかるんですけど・・・ 変換指定の%sというものは、 「アドレスを受け取って、受け取ったアドレスにある文字列を\0がくるまで表示する」 というものなのでしょうか? int型のポインタで同じように printf ("%d", pointer); とすると、pointerの値であるアドレスが10進数表示されて、pointerが指している変数の値を表示するには、 printf ("%d", *pointer); としなければならないわけで、そういうことをいろいろ考えていたら、収拾がつかなくなってしまって(^_^;) 「とにかく%sはそういうものなの!!」と丸暗記すれば困るようなことはないのですが、どうにもモヤモヤしっぱなしなので、%sの動きについて詳しくお分かりの方がいらっしゃいましたら、ご教授下さい。 よろしくお願いしますm(__)m

  • C言語の型と配列

    char* str[10]={"a","b"}; char* str2="c"; としたときにstr=str2とすると 型が合わないといったエラーが出ます。 でもstrって結局はポインタの配列の先頭要素のアドレスですよね。 ポインタにポインタを入れているので通るのかなと思ったんですけど、 配列で宣言するとポインタにも型がつくのでしょうか? この例だと strは char * を10個持つ配列をさすポインタ  で、 str2はchar *をさすポインタ みたいなかんじです。 質問の意味がわかりにくいですが、ご指摘をいただければ補足しますので よろしくお願いします。

  • 「*」←この記号はなに?【C言語】

    http://ja.wikipedia.org/wiki/Gets このページなど、ウィキペディアなどでC言語の関数のページ(getsとかfopenとかなんでも)を見ると、形式の部分で :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::     char *gets(char *s)        :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ↑このように*が入って説明されているじゃないですか。*はポインタの前につけるんですよね?でもgetsはポインタじゃないです。 ソースコードの例でも、 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::    char a[10];             :: ::    gets(a);              :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ↑のように*は省かれています。 このような「*」は一体何を意味するんでしょう? 回答よろしくお願いします。

  • C言語のポインターに関する警告

    line[100]で 「1」が格納されていたら「a」 「2」が格納されていたら「b」 「3」が格納されていたら「c」 とout[100]に代入する関数を作りたいのですが コンパイルすると関数の部分で warning: assignment makes integer from pointer without a cast という警告がでます。 ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。 どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。 解決法をおしえてください。お願いします。 /*宣言*/ int=i; /*main関数内のfor文で使用*/ char line[100], out[100]; void change(int); /*関数*/ void change(int i)   {    if(line[i]=='1'){     out[10]="a\0"    }if(line[i]=='2'){     out[10]="b\0";    }if(line[i]=='3'){     out[10]="c\0" } }

  • C言語での文字列処理

    以下のようなファイルを 年/月/日 時間 値1 値2 値3 値4という風に出力し直したいのです。 1行ごとに段落分けされている場合、 fscanfを使うだけで大丈夫であると思われるのですが、 このように区切られていないデータの処理方法は どのように行えばよいのでしょうか? fgetsを用いてchar型の変数に入れていく方法を考えたのですが、 途中でセグメントエラーが発生しております。 御回答よろしくお願いします。 2004-01-01 00:00:00.000 001 155.00 74.00 -81.00 -3.00 2004-01-01 01:00:00.000 001 346.00 135.00 -211.00 -38.00 2004-01-01 02:00:00.000 001 342.00 138.00 -204.00 -33.00 2004-01-01 03:00:00.000 001 252.00 136.00 -116.00 10.00 2004-01-01 04:00:00.000 001 285.00 142.00 -143.00 0.00 2004-01-01 05:00:00.000 001 512.00 203.00 -309.00 -53.00 2004-01-01 06:00:00.000 001

  • C言語 ソートについて

    #include <stdbool.h> #include <stdio.h> void swap(char *a, char *b) { } bool is_at(char c) { } void justify(char line[], int n) { } int main(void) { char line[] = "a@b@@@c@@d@@@ef@@g"; size_t n = sizeof(line) - 1; justify(line, n); printf("%s\n", line); return 0; } 上の雛形を使って文字列lineに含まれる@以外の文字を文字列の前の方に詰めていくプログラミングを作るという問題を解いていたのですが下のプログラミングまでは出来たのですが最後のjustifyの部分がわかりません 良ければ解答をお願いします #include <stdbool.h> #include <stdio.h> void swap(char *a, char *b) { char temp = *a; *a = *b; *b = temp; } bool is_at(char c) { if(c == '@') { return true; } else { return false; } } void justify(char line[], int n) { for(int i=0;i<n-1;i++) { } } int main(void) { char line[] = "a@b@@@c@@d@@@ef@@g"; size_t n = sizeof(line) - 1; justify(line, n); printf("%s\n", line); return 0; }