• ベストアンサー

配列の比較について・・・困ってます・・。

itohhの回答

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

こんにちは。itohhといいます。 もし、固定で良いのでしたら、補足で書かれているように配列に持っておくほうが楽ですね。 char strData1[]={(char)0x90,           (char)0x3C,           (char)0x40,           (char)0x83,           (char)0x60,           (char)0x80,           (char)0x3C,           (char)0x00};    :    :    : fwrite( strData1, sizeof( char ), sizeof(strData1), fout2 ); strlen(strData1)では、最後の0x00を数えてくれません、ですからsizeof(strData1)ですね。 strData1を必要な分だけ用意しておくと良いのではないでしょうか。 strData2,strData3などなど。 こんなとこでしょうか?

kitapei
質問者

お礼

どうもありがとうございました。長期間にわたり回答寄せてくださってありがとうございました!!! おかげさまで、いろいろ勉強することができました!!また、わかんないことがでてきたらここで質問してべんきょうしていきたいと思います。 本当にありがとうございました!!

関連するQ&A

  • ファイルの入出力を行って文字を変換する

    入力するファイルにa~zを記入しておき、 出力するファイルにaなら1、bなら2、zなら26に変換させたいのですがどうしたらよいでしょうか? #include <stdio.h> #include <string.h> #define DELIMITER "/ ," /* 区切り文字 */ int main(void) { FILE *fin,*fout; int count=0; int i; char s[256], s2[256]; char alpha[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int kazu[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; char *taken; char *strch[50]; if( (fin=fopen("file1.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s,256,fin)!=NULL) { while (token != NULL) { strch[count]=token; token = strtok(NULL, DELIMITER); count++; } memset(s2, NULL, sizeof(s2)); fprintf(fout,"%d\n",s2); } fclose(fin); fclose(fout); return 0; }

  • 配列

    適当な記述ですが、次を見てください。 void roll(int *c) { int n, b2[8]; if(t<3) { for(n=0; n<8; n++) b2[n]=c[n]; for(n=0; n<8; n++) c[b2[n]]=7-n; for(n=0; n<8; n++) printf("%d",c[n]); printf("\n"); t++; roll(c); } else t=0; } int main() { int b[]={3,6,4,0,7,2,5,1}; roll(b); for(n=0; n<8; n++) printf("%d",b[n]); //36407251が表示されるようにしたい。 return(0); } rollが何の関数かは省略しますが、rollにmainのb(ポインタ?)を渡し、ある処理をして,それでmainに戻ってきた時にb[]を表示すると、36407251が表示されません。 ポインタを引数にするってことはポインタでさしてるとこをrollで操作してるわけですよね? そうすれば変わって当然だとはおもいます。 でも関数1で関数2に配列1を渡し、その関数2の中でで配列1の値が変化しても、元の関数1にもどれば配列1のまま変化していないようにするにはどうすればいいですか? やはり もう1つ配列を用意しなきゃだめなのでしょうか。

  • 多次元配列の処理について

    多次元配列を扱った処理を行ないたいのですが、一部でnullを受け取ってしまい、処理を行うことができません。 引数の配列には次のようなテキストが入っています。 --配列の内容-- 0,名詞-一般,1,5, 0,名詞-数,2,6, 0,名詞-接尾-助数詞,3,7, -------------- この配列をコマンドラインに書き出すと正確に表示されます。 しかし、配列の内容を参照して処理を行なうと2列目の処理のときにnullを参照してしまいます。 プログラムは以下のとおりです。 ---プログラム--- public class Dist {   public static int zairyo(String[][] date) {    int a = 0;    int b = 0;    int c = 0;    int d = 0;    int e = 0;    if(date != null) {     int f = 0;     System.out.println("//Dist//");     for(int m = 0; m < date.length; m++) {      for(int n = 0; n < date[0].length; n++) {       if(date[m][n] != null) {        System.out.print(date[m][n] + "\t");        f++;        if(f == date[0].length) {         System.out.println("");         f = 0;        }       }      }     }     for(int i = 0; i < date.length; i++) {      if(date[i][1] != null) {       if(date[i][1] == "名詞-一般")        a++;       if(date[i][1] == "名詞-数")        b++;       if(date[i][1] == "名詞-接尾-助数詞")        c++;      }else System.out.println("2列目null");     }     int j = date.length - 1;     d = Integer.parseInt(date[j][2]);     e = Integer.parseInt(date[j][3]);    }else System.out.println("Dist:null");    if(a > 0 && b > 0 && c > 0 && d <= 10 && e <= 15) {     return 1;    }else return 0;   } } ------------------------ 原因は何なのでしょうか? ご教授お願いします。

  • ファイル中のデータの読むとき・・・・

    こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば 大まかな構造として、 int fncCheck(char*pch,char item) { int count=0; int i=0; for(i=0;i<strlen(pch);i++) {if(pch[i]==item) { count++; } } return count; } int main() { FILE *fin,*fout;  //ここでいろいろ宣言 if((fin=fopen("Thermoplasmaacidophilum ","r"))==NULL) { cout<<"No files exist in current directory!\n"; exit(-1); } if((fout=fopen("Thermoplasmaacidophilum _out","wb"))==NULL) { cout<<"Output file can't open!\n"; exit(-1); } if((fin=fopen("Thermoplasmaacidophilum ","r"))!=NULL) { fwrite(SMF_header,14,1,fout); fwrite(SMF_firsttrack,36,1,fout); fwrite(SMF_track,13,1,fout); do {    //ここにdoに関する処理 } while(numread==100); while(c=fscanf(fin,"%c",c)!=EOF) {   //ここに処理をずらずら } printf("There are %d bases!!\n",n); fclose(fin); fclose(fout); } return 0; } ・・・のように書くと、一つ目のdo-while文は実行されるんですが、二つ目のwhile文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

  • カラー画像からグレースケール画像フォーマットの変換

    カラー画像からグレースケール画像フォーマットの変換するプログラムなんですが、いまいち理解できていません。 プログラムはRGB構造体を使ってのものなんですが添削お願いいたします。 #include<stdio.h> #include<stdlib.h> typedef struct _RGB { unsigned char r; unsigned char g; unsigned char b; } RGB; int main(int argc, char *argv[]) { int x, y; unsigned char *in, *out; int i, j, Magic, level; unsigned char tmp[255]; RGB **pixels; int width = 255; int height = 255; int size = width * height; FILE *fin, *fout; if(argc != 3){ printf("Usage : %s input outpu \n", argv[0]); exit(1); } fin = fopen(argv[1], "rb"); fgets(tmp, 255, fin); if(tmp[0] != 'P'){ return 0; } sscanf(tmp, "P%d", &Magic); if(Magic < 1 || Magic > 6){ return 0; } do{ fgets(tmp, 255, fin); } while(tmp[0] == '#'); sscanf(tmp, "%d %d", &x, &y); if(x < 1 || y < 1){ return 0; } fgets(tmp, 255, fin); sscanf(tmp, "%d", &level); printf("P%d\n", &Magic); printf("%d %d\n", x, y); printf("%d\n", level); in = (unsigned char *)malloc(sizeof(unsigned char) *x*y); fread(in, sizeof(unsigned char), x*y, fin); pixels = (RGB**)malloc(width*sizeof(RGB*)); pixels[0] = (RGB* )malloc(size * sizeof(RGB)); for(i = 1; i < width; i++){ pixels[i] = pixels[i - 1] + height; } free(pixels[0]); for(i = 1; i < width * height * 3; i++){ out[i] = pixels[i][0].r * 0.299 + pixels[i][1].g * 0.587 + pixels[i][2].b * 0.114; } fout = fopen(argv[2], "wb"); fprintf(fout,"P%d\n",Magic); fprintf(fout,"# My new PGM\n"); fprintf(fout,"%d %d\n",x, y); fprintf(fout,"%d\n",level); fwrite(out, sizeof(unsigned char),x*y, fout); free(pixels); free(in); free(out); free(fin); free(fout); }

  • 昇順ソート

    sort.txtから読み込んだ値を 昇順でソートして出力するにはどうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int strcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; int length; char s[256], s2[256]; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s, 256, fin) != NULL) { /* 要素数を求める */ length = sizeof(s) / 256; /* 昇順でソート */ qsort(s, length, 256, strcmp_asc); /* memset(s2, NULL, sizeof(s2)); for (i = 0; i < length; i++) { } */ fprintf(fout,"%s\n",s2); } fclose(fin); fclose(fout); return 0; } int strcmp_asc(const void *sa, const void *sb) { return strcmp((char *)sa, (char *)sb); } sort.txt 50 45 35 25 15 10 5 1 32 46 8 7 9 19 18 14 16 13 12 17 11 20 40 30 31 3 2 37 38 36 33 39 34 49 47 48 4 6 44 42 43 41 21 22 26 24 28 29 27 23

  • 配列の使い方がわかりません

    n=1~20 s=n(n+1)(2n+1)(3n^2+3n-1)/30 のsの結果を数表にする問題で、 n  s    n   s   1  _   11 _ 2  _  12 _ ・      ・ ・      ・ ・      ・ 10 _  20  _ というような表示をしたくて、配列を用いてしてるんですが、うまくいきません。どなたか、教えてください。 public class suuhyou{ public static void main(String[] args){ int a=0,b=0,c=0,d=0,s=0; int[] x = new int[50]; for(int n=1;n<=50;n++){ a = n; b = n + 1; c = 2 * n + 1; d = 3 * n * n + 3 * n - 1; s = a * b * c * d / 30; int x[n] = s; } for(int k=1;k<=10;k++){ System.out.print ( k + ":" + x[k] +","); System.out.print ((k+10) + ":" + x[k+10]+","); System.out.print ((k+20) + ":" + x[k+20]+","); System.out.print ((k+30) + ":" + x[k+30]+","); System.out.println((k+40) + ":" + x[k+40]); } } } 自分でやっていたら、最後はこんな風にだんだんめちゃくちゃになってしまいました。このときはnが50まででやってます。お願いします。

  • 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); } } } } } } }

  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 引数に二重配列のある関数について

    void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.