C言語で文字と整数型の二次元配列を作成する方法

このQ&Aのポイント
  • C言語で文字列ではなく、文字の二次元配列を作成する方法について教えてください。
  • int型の二次元配列を文字として利用することは可能でしょうか?
  • 文字の二次元配列を使って表を表示したいです。どなたか知識をお持ちの方がいらっしゃいましたら、ご教示いただけますか?
回答を見る
  • ベストアンサー

C言語で文字列ではなく、文字の

C言語で整数型の時は例えば int d[3][5]; などとおいて二次元配列を作り、文字列のときは char a[3][4]="abc,bcd,cde";(←ちょっとこの宣言も合っている自信はないが) という様に置きますよね。こういうのを文字でも利用して、 1 2 3 4 5....... A s t u v w x y.... B i u i k i k u.... C j j j j o o o.... :.................. :................. :................ という様な表を文字の2次元配列を使って printf("%c",c[i][I]); のように表したいのですが、int d[i][I]のように 文字を二次元配列を作ることは出来るんでしょうか? どなたか知っている方がいたら教えてください。

  • Rucas
  • お礼率58% (48/82)

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

普通の文字の2次元配列なら、intと同様に下記の様に書けます。 void sample1(void) {  int i, j;  char a[3][3] = {   {'a', 'b', 'c' },   {'1', '2', '3' },   {'X', 'Y', 'Z' }  };  for(i = 0; i < 3; i++){   for(j = 0; j < 3; j++){    printf("%c ", a[i][j]);   }   putchar('\n');  } } この場合は文字列の話は関係ないですね。 ----------------------------------------------------------- 初期化の部分で文字列を使いたいと言う意味なら、文字列の配列にする。 これは文字の2次元配列ではないが、2次元配列のように扱えます。 void sample2(void) {  int i, j;  char *a[3] = {   "abc",   "123",   "xyz"  };  for(i = 0; i < 3; i++){   for(j = 0; j < 3; j++){    printf("%c ", a[i][j]);   }   putchar('\n');  } } ----------------------------------------------------------- 質問の意図がハッキリ分からないのですが、 これで回答になってるかな?(^^; #サンプルソースは説明の為の物です。手抜き&全角スペース入り。

Rucas
質問者

お礼

回答ありがとうございました。そうです。私が聞きたかったのは まさにそこです! 文字でやろうとしてもどうしても文字列になってしまいうまくいかず困っていました。詳しい回答,大変助かりました。

その他の回答 (1)

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.1

何故やってみないのですか? 宣言したソースをコンパイルしてみればすぐ分かるはずです。 はっきり言えば変数の型と配列の次元数に関連は一切ありません。 6でも7でもコンパイラの仕様上許される範囲まで指定できます。

Rucas
質問者

お礼

やってみたのですが,文字列の1元配列になっただけだったんですよ。 だから,もしかしたら出来ないのかもと思ったのです。 まずは出来るのか出来ないのかがわからないと手が打てないので質問しました。回答ありがとうございました。

関連するQ&A

  • 2次元配列を使ったC言語の九九表を作りたいんですが、方法がわかりません。

    C言語で、九九の表を作っているのですが2次配列を使わないでの方法なら出来るんですが、 2次配列を使うと出来なくなってします。 下記のように途中まで組んだのですが、どうしてもエラーがでてしまいます。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]= {1,2,3,4,5,6,7,8,9},{2,4,6,8,10,12,14,16,18},{3,6,9,12,15,18,21,24,27},{4,8,12,16,20,24,28,32,36},{5,10,15,20,25,30,35,40,45,6,12,18,24,30,36,42,48,54,7,14,21,28,35,42,49,56,63},{8,16,24,32,40,48,56,64,72},{9,18,27,36,45,54,63,72,81} }; for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d",a[9][9]); printf("\n"); } return 0; } とやったのですが…以下に書く部分が間違っているようで。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]=□ } for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d", □); printf("\n"); } return 0; } 色々調べたり、少しずつ変えながら試しているのですが、できません。 どなたかわかるかたいらっしゃいますか。間違いがわかりません… 配列を使用しなくても出来ることは、わかるのですが、配列を使うバージョンでもできるようになりたいんです。 私がしようとおもっているのは、81個分の値を先に計算し、9×9の2次元配列に格納し、次に81個の配列要素の値を出力したいのですが、 間違いと方法がわかる方いらっしゃいませんか。

  • C言語で2次元配列の引数定義やコピーの仕方など

    2次元配列の引数の定義や渡し方や ある変換する関数で、すべて' '(スペース)にしたり[memmoveなど1命令で]や、 それぞれ一つ違う値 A->B, O->Pに置き変える関数しようとしているのですが、 C言語のデータ操作に非常に疎く、どのようにすれば良いかわかりません。 どのようにすれば良いのでしょうか? 環境はWindowsで VisualC++6.0です。 GCCもソースを変えずに同じように出来るのでしょうか? #include <stdio.h> char lesson[7][6] = { {'A', 'B', 'C', 'D', 'E', 'F'}, // MON {'G', 'H', 'I', 'J', 'K', 'L'}, // TUE {'M', 'N', 'O', 'P', 'Q', 'R'}, // WED {'S', 'T', 'U', 'V', 'W', 'X'}, // THU {'Y', 'Z', 'a', 'b', 'c', 'd'}, // FRI {'e', 'f', 'g', 'h', 'i', 'j'}, // SAT {'k', 'l', 'm', 'n', 'o', 'p'}, // SUN }; // --- 多次元配列の引数の渡し方がわからないのでvoid --- void print_data(void) { for(int i=0; i < 7; i++){ for(int j=0; j < 6; j++){ printf("%c ", lesson[i][j]); } printf("\n"); } } // --- 問題の変換関数(引数定義と内容 --- int convert(????) { ???? } // --- メイン --- int main(boid){ print_data(); conver(???); // <--- どのように引数に渡すのか? print_data(); return 0; }

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • C言語で3次元配列の課題をしています。

    C言語で3次元配列の課題をしています。 5人の学生の3科目(国数英)の点数を前期と後期の2回分について三次元配列に入力し、各学生の前期と後期の合計と前・後期の合計を求めるプログラムです。 配列に数値を格納するあたりまでは分かったものの、そこから先がよくわからなくなってしまいました。どなたか解説とともに、成績の出力の仕方を教えていただけないでしょうか。for文を使えばいいというのはわかりますが・・・。 以下に出来た部分までのソースを載せておきます。まだ未熟な上、変なミスがあるかもしれません。 #include <stdio.h> main() { /*配列を宣言*/ int score[0][3][5],i,j,k; int total,sum[2][5]; /*配列に成績を入力*/ for(i=0;i<2;i++){ for(j=0;j<3;j++){ for(k=0;k<5;k++){ printf("score[%d][%d][%d] = ",i,j,k); scanf("%d", &score[i][j][k]); } } } /*合計を計算する*/ for(i=0;i<5;i++){ for(j=0;j<2;j++){ total=0; for(k=0;k<3;k++){ total = total + score[i][j][k]; } sum[i][k]=total; } sum[2][k]=sum[0][k]+sum[1][k]; } /*出力する*/ /*??*/ } ※三次元配列のscoreの始めの[]は、0が前期成績、1が後期成績を格納する部分です。

  • 【C言語】入力された文字種別ごとにカウント

    以下のように実行したいのですが、 どのように組んだら良いのでしょうか? 宜しくお願いします。 言語はC言語で、環境はVisual C++ 2010 Express Editionを使っています。 ちなみに最後の方に現在のコードがあります。 ///////////////////////////////////////////// 文字を入力しなさい(終了条件:Ctrl+Z) abcdef678ABCDEFopuKLH ghtJK+ghjBBBdgjk ^Z a : 1個入力 b : 1個入力 c : 1個入力 d : 2個入力 e : 1個入力 f : 1個入力 g : 3個入力 h : 2個入力 i : 0個入力 j : 2個入力 k : 1個入力 l : 0個入力 m : 0個入力 n : 0個入力 o : 1個入力 p : 1個入力 q : 0個入力 r : 0個入力 s : 0個入力 t : 1個入力 u : 1個入力 v : 0個入力 w : 0個入力 x : 0個入力 y : 0個入力 z : 0個入力 A : 1個入力 B : 4個入力 C : 1個入力 D : 1個入力 E : 1個入力 F : 1個入力 G : 0個入力 H : 1個入力 I : 0個入力 J : 1個入力 K : 2個入力 L : 1個入力 M : 0個入力 N : 0個入力 O : 0個入力 P : 0個入力 Q : 0個入力 R : 0個入力 S : 0個入力 T : 0個入力 U : 0個入力 V : 0個入力 W : 0個入力 X : 0個入力 Y : 0個入力 Z : 0個入力 /////////////////////////////////////// #include <stdio.h> #include <conio.h> #define ALPHABET_COUNT 52 int main(void) { // 入力アルファベットの個数を数えるカウンタは大きさ 52 の配列で用意。 int counter[ALPHABET_COUNT]; int c; int i; // 最初に、配列の 52個の要素すべてを0クリアする for(i=0;i<52;i++){ counter[i] = 0; } printf("文字を入力しなさい(終了条件:Ctrl+Z)\n"); while(1){ c = getchar(); if(c == EOF){ break; } if(c >= 'a' && c <= 'z'){ //65<90 counter[c-'a']++; } else if(c >= 'A' && c <= 'Z'){ //97<122 counter[c-'A']++; } } // 文字種別の個数表示する c = 'a'; for(i=0;i<ALPHABET_COUNT;i++){ if(i<26){ printf("\t%c : %3d個入力",c++,counter[i]); if(((i+1)%3) == 0){ printf("\n"); } } else{ if(i==26){ printf("\n"); c = 'A'; } printf("\t%c : %3d個入力",c++,counter[i]); if(((i+2)%3) == 0){ printf("\n"); } } } printf("\n"); /* c = 'a'; for(i=1;i<=26;i++){ printf("\t%c : %3d個入力",c++,counter[i-1]); if(i%3 == 0){ printf("\n"); } } printf("\n"); */ }

  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

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

    ファイルの文を読み込み、I、Weなどの定めた単語の数を数えるプログラムを作りたいのですが、うまくいきません。 具体的な問題点は、単語の数を数える際、一致する単語があった場合、再び最初から文を見直すため、無限ループしてしまう。 We,WE、weなど大文字小文字の違いで単語が数えられないなどです。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char filename[FILENAME_MAX]; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; int w; char str[50]; FILE *fp; gets(filename); fp = fopen(filename,"r"); { if(fp==NULL) { printf("ERROR"); return -1; } } fscanf(fp,"%50s",str); for(w=0;w<=j+k+l+m+n+o;w++) { if(strcmp("I",str)==0) { j++; } if(strcmp("We",str)==0) { k++; } if(strcmp("You",str)==0) { l++; } if(strcmp("He",str)==0) { m++; } if(strcmp("She",str)==0) { n++; } if(strcmp("They",str)==0) { o++; } } printf("I: %d\n",j); printf("We: %d\n",k); printf("You: %d\n",l); printf("He: %d\n",m); printf("She: %d\n",n); printf("They: %d",o); fclose(fp); return 0; }

  • c言語配列の問題について

    c言語配列の問題について 以下のプログラムは10個の数値を入力させ重複している文字を表示するプログラムですが match==i[k]でどの様に重複した数値を認識しているのかが解説不足で理解できません。 どの様に処理されているのか詳しく解説できる方がいましたらご教授願います。 #include <stdio.h> int main(void) { int i[10],j,k,match; printf("10個の数字を入力して下さい"); for(j=0;j<10;j++) scanf("%d",&i[j]); for(j=0;j<10;j++){ match=i[j]; for(k=j+1;k<10;k++) if(match==i[k]) printf("%dが重複しています\n",match); } return 0; }

専門家に質問してみよう