2017-08-30 12 views
0
FILE *fp; 

fp = fopen(filen, "wb"); 

const char tok[2] = ","; 
char str[340]; 

while (fgets(str, 340, stdin) != NULL) 
{ 
    struct test loadTest; 
    printf("You entered: %s", str); 
    strncpy(loadTest.level, strtok(str, tok), 20); 
    strncpy(loadTest.first, strtok(NULL, tok), 30); 
    fwrite(&loadTest, sizeof(struct test), 1, fp); 
} 

fclose(fp); 

すべてのこんにちは、私は私のコードでセグメンテーションフォールトエラーを取得していますいくつかの理由セグメンテーションフォールト・ブロック

上記の小さなコードブロックのどこかにエラーがあります(これはsegフォルトのために変更したものです)が、私はそれを特定することはできません。

セグメンテーションの不具合は私がアクセスすべきではないメモリへのアクセスと関係していることは知っていますが、コード内でどこでそれをしているのかわかりません。

ご協力いただければ幸いです!

+2

は、あなたがコードをデバッグしようとしたことがあり修正されますか? – hrust

+4

トークンの長さが指定の20と30に固定されていますか? – Lemonov

+0

出力ファイルが正常に開かれたことを確認しますか? –

答えて

-1

  • ファイルへの読み取り/書き込みの前にあなたのコードのいくつかの改善

    • fopenのチェック結果は、それらの値
    • 使用sizeofの代わりに、一定の(コメントで述べたように)
    • を使用する前に、変数を初期化します
    • strtok()NULLを返すことができます。これはチェックする必要があります(hereを参照)
    • あなたトンので、ここではthis

    の慎重strncpy()を使用するには、コードのバージョン

    FILE *fp; 
    
    fp = fopen(filen, "wb"); 
    
    if (fp == NULL) 
    { 
        printf("Error opening file: %s", filen); 
    } 
    else 
    { 
    
        const char tok[2] = ","; 
        char str[340]; 
    
        while (fgets(str, sizeof(str), stdin) != NULL) 
        { 
         struct test loadTest; 
         char *level; 
         char *first; 
         memset(&loadTest, 0, sizeof(loadTest)); 
         printf("You entered: %s", str); 
         level = strtok(str, tok); 
         if (level == NULL) 
         { 
          continue; // bad input ? 
         } 
         first = strtok(NULL, tok); 
         if (first == NULL) 
         { 
          continue; 
         } 
         strncpy(loadTest.level, level, sizeof(loadTest.level)-sizeof(char)); 
         strncpy(loadTest.first, first, sizeof(loadTest.first)-sizeof(char)); 
         fwrite(&loadTest, sizeof(loadTest), 1, fp); 
        } 
    
        fclose(fp); 
    } 
    
  • +0

    これは改善点ですが、segフォルトを停止するとは思わないです。それらをコメントのように投稿してください。 – i486

    +0

    @ i486コメントのように投稿する必要がありますか?回答を投稿する前に質問にコメントを追加しました。私はファイルが正常に開かれていないためsegfaultが表示されると思います。 'fp'は' fopen'の後にNULLです。 –

    +0

    あなたは 'fopen'が問題であると疑うことができます。それは100%確実ではない=>解決策はコメントのため、答えではありません。 – i486

    関連する問題