• ベストアンサー

C言語に詳しい方、ご指導をお願いします。

C言語を今勉強しています。 ある調べたい数値を入力して、txtの中に入っている数字(10000までの素数)を読み込み、その素数たちを利用して素因数分解しようとしています。 しかし、何度試しても読み込みだけしか行われず、 調べたい数値を入力することすらできません。 どこに問題があるのでしょうか、ぜひご指導をお願いします。 今作成しているプログラムです。 #include<stdio.h> void main(void) {int i,k,num,p[10000]; {for(i=0;scanf("%d",&p[i])!=EOF;i++){} num=i; } printf("素因数分解したい整数は?\n"); scanf("%ld",&k); printf("%ld=",k); while(p[i]<=num) { for(i=0;p[i]<=num;i++) {if((k%p[i])==0) {printf("%ld*",p[i]); k=k/p[i]; break; } } } printf("%ld\n",k); } txtの中身 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71             ・             ・             ・ 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 9901 9907 9923 9929 9931 9941 9949 9967 9973

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

> while(feof(fin)=0) finというのはこちらの提示したソースのfpに相当するものと思っていいですね? =は一つ(代入演算子)ではなく二つ(論理演算子のequal)です。 あと、コンパイラに何をお使いかが不明(今更ですが)なのですが、関数の使い方はたいていヘルプに載っています。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

う~ん, なぜ %ld を使ってるんだろ....

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

No.1です。 No.3の変形になりますが、ざっくりとこんな感じでしょうか。 FILE *fp; i=0; /* カウンタを外に置く */ fp = fopen("***.txt", "r"); /* ファイルオープン ***.txtは実際のテキストファイル名に置き換えること */ if(fp == NULL){ /* エラー処理 */ }else{ while(feof(fp) == 0){ /* これが終了条件のEOF検出 EOFにくると0でない値が帰ってくる */ if(fscanf(fp, "%d", &p[i++]) == EOF){ fclose(fp); /* エラー処理(EOFでないのに読み取り失敗しているため) */ } } fclose(fp); num = i; }

oranchi
質問者

補足

なんども来ていただいてありがとうございます! {while(feof(fin)=0) の部分がエラーとなってしまいます… これはオペランドの問題でしょうか? feofの使い方がわからないため、全く改善できません… お力を貸してください。お願いします。

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

入力リダイレクトだと標準入力がファイルになるので次のscanfでキーボード入力は出来なくなりますね 普通にファイルをオープンして { FILE* fp; fp = fopen("txt", "r"); for (i = 0; fscanf(fp, "%d", &p[i]) != EOF; i++){} num = i; fclose(fp); } でどうでしょう

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

実行はどうしてますか txtをリダイレクトしてないのでは ./a.out < txt

oranchi
質問者

補足

txtをリダイレクトしていますが、なぜかscanf("%ld",&k); が働きません… アドバイス、ありがとうございました!

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

・肝心のtxtファイルを開いていない(fopen) ・ファイルから読み込むのはscanfじゃなくてfscanf。scanfを使っているために入力待ちになってしまっている ・最初のループはforよりwhileを使った方が自然 ・ループ脱出条件はfscanfの失敗よりfeof等で確実にEOFを検出する とりあえず最初のprintfまでの間でこれだけ気になったり問題と思われる箇所があります。

oranchi
質問者

補足

さっそくのご指摘ありがとうございます! 上の3つを書き直してみましたが、一番したのループ脱出条件でEOFを検出するという方法がわかりません… 知っているbreakで試したところ、さっぱりでした。 教えていただけたら幸いです。

関連するQ&A