プロが教えるわが家の防犯対策術!

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

A 回答 (6件)

・肝心のtxtファイルを開いていない(fopen)


・ファイルから読み込むのはscanfじゃなくてfscanf。scanfを使っているために入力待ちになってしまっている
・最初のループはforよりwhileを使った方が自然
・ループ脱出条件はfscanfの失敗よりfeof等で確実にEOFを検出する

とりあえず最初のprintfまでの間でこれだけ気になったり問題と思われる箇所があります。

この回答への補足

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

補足日時:2008/07/23 12:51
    • good
    • 0

実行はどうしてますか


txtをリダイレクトしてないのでは
./a.out < txt

この回答への補足

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

補足日時:2008/07/23 12:56
    • good
    • 0

入力リダイレクトだと標準入力がファイルになるので次のscanfでキーボード入力は出来なくなりますね


普通にファイルをオープンして
{
FILE* fp;
fp = fopen("txt", "r");
for (i = 0; fscanf(fp, "%d", &p[i]) != EOF; i++){}
num = i;
fclose(fp);
}
でどうでしょう
    • good
    • 0

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

この回答への補足

なんども来ていただいてありがとうございます!

{while(feof(fin)=0)

の部分がエラーとなってしまいます…
これはオペランドの問題でしょうか?
feofの使い方がわからないため、全く改善できません…
お力を貸してください。お願いします。

補足日時:2008/07/23 17:20
    • good
    • 0

> while(feof(fin)=0)



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

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!