1. ホーム
  2. c

[解決済み] プロセスが戻り値3221225477で終了した

2022-01-30 17:35:40

質問

私はこのコードを書いています。

#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int i;
fp = fopen("keimeno.txt","r");
fscanf(fp,"%d",i);
printf("%d\n",i);
    fclose(fp);
return 0;
}

を含み、そのファイルには

2
Yiannis Ioannou 356
3
Today
10347
If
345
And then none
1542
John Smith 743
2
My story
3940
Feedback
682
END

実行しようとすると、valueが終了してしまいます。 3221225477 という数字が表示されるのではなく、2...

なぜなのか、どなたか説明してください。

解決方法は?

数値をスキャンする場合、結果を格納する変数のアドレスを渡す必要があります。

fscanf(fp,"%d",&i);

があるところ。

fscanf(fp,"%d",i);
               ^  missing the & sign!

コンパイラは警告を出すべきでしたね - コンパイル時に警告を有効にしていますか?

ここで起きているのは fscanf 関数は指定された場所に書き込みます (あなたの場合、この関数は を指します。 によって i に書き込むのではなく の場所 i ) . その結果、あなたの場合、プログラムがクラッシュするまでの相当な時間、"running"することになるのです。

Brandinが指摘したように、あなたのコードにはさらなる問題があります(問題の原因である可能性は低いのですが)。ファイルを開こうとするときは、必ず成功したかどうかをチェックする必要があります。 これは、次のような方法で行います。

#include <assert.h>
// at the top of the program


// attempt to open the file:
fp = fopen("keimeno.txt","r");
// and check whether you succeeded:
assert(fp != NULL); // this says "check fp is not NULL. Otherwise, quit."

あるいは、次のようにして、もう少しきれいにすることもできます。

const char *fileName = "keimeno.txt";
const char *mode = "r";
if((fp=fopen(fileName, mode))==NULL) {
  printf("cannot open file %s\n", fileName);
  return -1;
}

関数呼び出しの中に埋め込むのではなく、プログラムの先頭付近に "ハードワイヤード値" を置くのが、ほとんどの場合良いアイデアです。