• ベストアンサー

プログラムが始まりません

以下のプログラムを書いたところ、コンパイルは出来たのですが 正しく動作するか動かしたところ、7行目のprintfも実行されませんでした。それより上の部分に不備があるのでしょうか。 何か基本的なことをなにか基本的なことを理解できてないのかもしれませんが、教えていただけませんでしょうか #include<stdio.h> int main(void) { FILE *fi; char fname[100], ss[255], *a, t, ch; int count, b, n, err, c[1000]; printf("file name?"); gets(fname); fi = fopen(fname,"r"); fgets(ss,255,fi); if(ss[0]!='P') err = 1; if(ss[1]!='3') err = 1; if(err ==1){ printf("file type is wrong\n"); exit(1); } while(count < 3){ *a = fgetc(fi); if(*a == 20){ count++; } } while(1){ *a = fgetc(fi); if(*a == EOF){ break; } if(*a == 20){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } ++a; } n == 0; while(c[n] !=0){ count == 0; while(count < 8){ if(c[n] == 1){ ch++; } ch == ch + ch; count++; } printf("%c",ch); } fclose(fi); }

  • pwpr
  • お礼率25% (11/44)

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

>msysを使っていたのがダメだったのでしょうか。 >msysでも、簡単な(hello wordと表示するだけのような)プログラムな>ら正常に動いたのですが・・・ たしかに、hello wordだけなら、動作しますね。 printf("file name?");の 次の行に、return 0; をいれると、msysでも、file name?が表示されるので、 gets(fname);が問題を起こしていると思われます。 msysとgetsの関係がわからないので、ここは、 緊急避難的に、ファイル名を、起動パラメータで与えてはどうでしょうか?(又は、コマンドプロンプトで実行するかです) この方法が、不明な場合は、再度補足して下さい。

pwpr
質問者

お礼

とりあえずコマンドプロンプトから実行する方向でやろうと思います。 ありがとうございました。

その他の回答 (4)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

プログラムが動作しないのとは関係ないと思いますが 代入と思われる部分が比較になっている箇所が3箇所あります n = = 0; count = = 0; ch = = ch + ch;

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

MINGWでこのソースをコンパイルしました。 正しく、動作しています。 a.exeのあるディレクトリで、(コマンドプロンプトで) a.exe 又は .\a.exe と打ってみて下さい。 file name? が表示されます。(こちらでは確認済みです)

pwpr
質問者

お礼

コマンドプロンプトで実行すれば表示されました。 ありがとうございました。 msysを使っていたのがダメだったのでしょうか。 msysでも、簡単な(hello wordと表示するだけのような)プログラムなら正常に動いたのですが・・・

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

もしかしたら、非常に基本的なところで、間違っているのかもしれません。(プログラムを動作させるためには、実行形式のプログラムを起動する必要があります。これが、行われていないような気がします) まず、以下の点について、補足して下さい。 1.開発環境(OSの名称、コンパイラの名称) 2.どのようにして実行したのか? 例えば、このプログラムのソースファイルをsample.cとすると、 「sample.c自体をダブルクリックしたけれども、動作しなかった」 というような質問者も、過去におりました。 このようなことはないと思いますが、具体的にどのようにして実行したのかを、補足して下さい。

pwpr
質問者

補足

OSはWindowsXP,コンパイラはMINGWで $ gcc decode.c(このファイル名) $ ./a.exe として実行しましたが、画面には何も出力されず、入力を促すようなカーソルが出ましたが何を入力しても反応しませんでした。

  • shred
  • ベストアンサー率35% (25/70)
回答No.1

printf("file name?\n"); このように改行を入れましょう。 理由は自分で調べましょう。

pwpr
質問者

お礼

書き直してみましたが、解決しません。 他に問題となる箇所はないでしょうか。

関連するQ&A

  • プログラムの異常終了

    TEST2とコマンドプロンプトに表示された後、異常終了します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char **f_name2){ printf("ファイル名を入力"); scanf("%s",*f_name2); } int count_num(FILE *fp){ int ch =0; int count=0; while((ch=fgetc(fp))!=EOF){ if(ch>0&&ch<9){ count++; } } return(count); } int main (void){ char *fname; FILE *fp; get_name(&fname); if((fp=fopen(fname,"r"))==NULL){ printf("ファイルオープンエラー"); }else{ printf("%d\n",count_num(fp)); } fclose(fp); printf("TEST2\n"); return(0); } textc13-7.exeは動作を停止しました。と表示があります。正常に終了したいので、 御指摘お願いします。

  • 無限ループに陥ります

    プログラム中の以下の部分で無限ループに陥ってしまいます while(*a != EOF){ *a = fgetc(fi); if(*a == 32){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } } fiに読み込んでいるファイルの末尾はこんな感じです。 50 49 0 34 34 34 34 34 34 34 34 34 34 34 34 50 49 0 68 68 68 51 51 50 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 [EOF] どなたか分かる方お願いします。

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • プログラム

    アドバイスをもとにいろんなサイトを見てみたんですが、なんとなくはわかるんですがこれから先どうしたら良いかわかりません。a,bを入力する画面まではいくんですが、それから先の結果がでないんです。何がいけないんですか? #include <stdio.h> double func(double x){ double y; y=x*x*x-3*x*x+9*x-8; return(y); } int main(){ double EPS=0.00005; double a, b, c; char t; int i=0; do{ printf(" a = "); scanf("%lf%c", &a, &t); printf(" b = "); scanf("%lf%c", &b, &t); if(func(a)*func(b) >= 0){ printf(" f(a)*f(b)>0\n\n"); } }while(func(a)*func(b) >= 0); if(b-a<0){ c=a; a=b; b=c; } while(b-a>EPS){ c=a-((b-a)/(func(b)-func(b)))*func(a); if(func(c)*func(a)<0){ b=c; }else{ a=c; } i++; printf(" %d\t%20.15f\n",i,c); }

  • ファイルからの読み込みについて

    スペースで区切られた数字列を3つずつ取り、3つ目の数字列の最後の数字が奇数ならば1を、偶数ならば2を配列に格納するプログラムを作っているのですが、 具体例 203 255 254 203 255 255 203 255 254 203 255 254 203 255 254 203 255 255 203 255 255 203 255 255 203 255 254 203 255 255 とあれば、2,1,2,2,2,1,1,1,2,1と順に格納する プログラムの実行がうまくいかず悩んでいます。 関係する部分を書き出すと b = 0; n = 0; m = 0; while(1){ data = fgetc(fi); if(data == EOF) break; a[n] = data; if(' ' == a[n]){ b++; } if(b == 3){ b = 0; t = a[n-1]; n = 0; if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[m] = 1; } else{ c[m] = 2; } m++; } else n++; } となっているのですが、上に書いた数字列をfiに読み込んで実行し、配列cを出力してみたところ 2122222222となっていました。 改行前は正確に出力されているので、改行する部分でなにか不都合が起こっているのかなと思い、いろいろ考えたのですが解決しません。 どなたかよろしくお願いします。

  • getsをscanfで書き直すにはどうしたらよいですか?

    現在。行数を数えるプログラムを例をみながらエディダに入力してコンパイルしてみたのですが、gets関数ではエラーが出てそれ以上すすまないです。 他の掲示板なんかをみると、getは危険だからscanfを使うといいですよと書いてあったのですが、書き換えかたがよく分からないのです。 *以下が問題にしているソースです。 /* ************************************* */ /* */ /* 行を数えるプログラム */ /* */ /* ************************************* */ #include <stdio.h> #include <stdlib.h> void main(void) { FILE *fp; char fname[256]; int c; int count; printf("ファイル名:"); if (gets(fnama) == NULL) { /* この部分 */ printf("入力エラーが発生しました。\n"); exit (-1); } if ((fp = fopen(fname,"r")) == NULL) { printf("ファイル '%s'をオープンできませんでした。\n",fname); exit (-1); } while ((c fgetc(fp)) != EOF) { if (c == '\n') { count++; } } printf(">>> ファイル %s は %d 行です。\n",fname,count); fclose(fp); }

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

  • C言語の質問です

    下記のプログラムはテキストファイルを読み込み、AからZまでの文字(小文字、大文字は区別しない)がそれぞれ何回 現れたかを数えるプログラムです。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int count[26]; int main(int argc, char *argv[]) { FILE *fp; char ch; int i; /* ファイル名の指定を調べる */ if(argc!=2) { printf("ファイル名の指定がありません\n"); exit(1); } if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } while((ch=fgetc(fp))!=EOF) { ch = toupper(ch); if(ch>='A' && ch<='Z') count[ch-'A']++; } for(i=0; i<26; i++) printf("%c は %d 回出現\n", i+'A', count[i]); fclose(fp); return 0; } 1)int count[26]; で、なぜ26なのかが分かりません。 2)count[ch-'A']++; はどういう動作をするのか詳しく教えてほしいです。 3)よって、for文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?

  • プログラムのソート

    "英語のテキストを読みこんで、出現する文字数のカウントをする"というプログラムを作成しました。このプログラムの出力を出現頻度順(大きい順)に並べ換えたいのですが、どの位置からソートを開始して、関数をどうすればいいのかがよく解りません。どなたかご教授下さい。 ↓取り敢えず、出来たプログラムを載せておきます。 #include<stdio.h> int main(int argc,char *argv[]) { int ch; // 小文字用 int CH; // 大文字用 int a; // str[CH]+str[ch] FILE *fp; int str[128]={0}; fp = fopen(argv[1],"r"); if(fp == NULL){ printf("I can't find it. You need to write a file name ! \n"); exit(1); }else{ printf("指定されたファイル '%s' 内の各文字の個数は以下の通り. \n",argv[1]); while((ch=fgetc(fp)) != EOF){ if(ch < 128) str[ch]++; } for(ch=0; ch<128; ch++){ if(str[ch] != 0){ if(ch>=65 && ch<=90 || ch>=97 && ch<=122){ // A~Z, a~z if(ch>=97 && ch<=122){ // a~z CH = toupper(ch); // 小文字を大文字に a = str[CH]+str[ch]; printf(" (%c)%5d (%c)%5d (%c+%c)%5d \n",CH,str[CH],ch,str[ch],CH,ch,a); } } } } fclose(fp); } return 0; }

専門家に質問してみよう