1. ホーム
  2. c

[解決済み] fprintfのセグメンテーションフォールト - 私が5歳のときのように説明してください。

2022-03-03 21:24:09

質問

ある文字列をファイルに書き込もうとしています。警告もなくコンパイルされましたが、a.outを実行するとセグメンテーション違反になります。しかし、ターゲットファイルは作成されます。私はC言語の初心者なので、書式やその他の欠点があることをお詫びします。以下は私のコードです。

#include<stdio.h>

int main (void)
{
    FILE *fp_out;

    char str1[]="four score and seven years ago our";
    char str2[]="fathers broughy forth on this continent,";
    char str3[]="a new nation, concieved in Liberty and dedicated";
    char str4[]="to the proposition that all men are created equal.";

    fp_out=fopen("my_file", "w");

    if(fp_out!=NULL)
    {
        fprintf(fp_out,"%s\n", str1[100]);
        fprintf(fp_out,"%s\n", str2[100]);
        fprintf(fp_out,"%s\n", str3[100]);
        fprintf(fp_out,"%s\n", str4[100]);
        fclose(fp_out);
    }
    else
        printf("The file \"my_file\" couldn't be opened\n");

    return 0;
}

解決方法は?

のマニュアルを読む必要があります。 fprintf() .

int fprintf(FILE *stream, const char *format, ...);

フォーマット文字列の中で %s を渡すということです。 fprintf() という文字列を指定します。

これは文字列です。

char str1[]="four score and seven years ago our";

このように、文字列を印刷するのです。

fprintf(fp_out,"%s\n", str1);

ここでやろうとしていること

fprintf(fp_out,"%s\n", str1[100]);

は101を表示します。 st の文字 str1 ということは、配列の長さをはるかに超えるメモリにアクセスしようとしていることになります。