0

プログラムでは、ユーザーに必要なファイルを開くように求めます。次に、ファイルの内容を 2D 配列に動的に割り当てます。次に、別の関数で、ファイルの内容を画面に出力することになっています。これを実行してもエラーは発生しませんが、ファイルの内容が意図したとおりに画面に出力されません。ファイルの内容を画面に出力するにはどうすればよいですか? その内容を配列に正しく動的に割り当てましたか?

ファイルのフォーマットはこんな感じ

1 0 0 0

0 0 0 1

1 1 1 1

これが私のコードです:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
FILE *get_grid(int ar[3][4]);
FILE *display_grid(int ar[3][4], FILE *fp);

int main()
{
  FILE *fp;
  char **ptr;
  int ar[3][4];

  fp = get_grid(ar);
  display_grid(ar, fp);
}//main ()

FILE *get_grid(int ar[3][4])
{
  FILE *fp;
  int i;
  char file[80]; 
  char **ptr;
  printf("File name: ");
  scanf("%s", file);
  fp = fopen(file, "r");
  ptr = (char **)malloc(3 * sizeof(char *));
  for(i = 0; i < 3; i++)
    ptr[i] = (char *)malloc(3 * sizeof(char *));
  return fp;
}//get grid

FILE *display_grid(int ar[3][4], FILE *fp)
{
  fprintf(fp, "%s", ar);
}//display grid
4

1 に答える 1

1

コードにはいくつかの論理的な問題があります。

  1. ではptr[i] = (char *)malloc(3 * sizeof(char *));3は実際には4+4である必要があります。その数が列の数です。各行には、3つのスペースで区切られた4桁の数字があります。これは7文字(または列)です。末尾に改行文字もあります。つまり、合計8列になります。

  2. あなたはどこにもファイルから読んでいません。

  3. コメントから、William Pursellが指摘したように、ローカルの配列にメモリを割り当てていますget_grid()ar[][]割り当てられたこのメモリは、メインのに影響を与えません。

  4. ファイルの内容を画面に印刷する必要があるとおっしゃいましたが、なぜそれを使用するのfprintf(fp, "%s", ar)でしょうか。これは、内容を入力ファイルに出力するだけです。代わりにできますprintf()

ソリューション:

  1. 変化する

    ptr[i] = (char *)malloc(3 * sizeof(char *));

    の中へ

    ptr[i] = (char *)malloc(8 * sizeof(char *));

  2. forループ内でget_grid()、メモリを割り当てた直後に、ptr[i]次のようにファイルの内容を1行ずつ読み取ります。

    fgets(ptr[i], sizeof(ptr[i]), fp);

  3. 上記のステートメントの直後にファイルから読み取ったのでar、次のように更新します。


/* Make sure you initialize 'p' and 'j' in the beginning */
char *p = strtok(ptr[i], " ");  /* This code gets the numbers from the */
do                              /* space-delimited array you have read from the file */
{                               /* Example: */
    ar[i][j] = atoi(p);         /* ptr[i]: "0 0 0 1" */
    j++;                        /* strtok(ptr[i], " ") will yield the first '0' */
} while(p = strtok(NULL, " ")); /* strtok(NULL," ") will continue where the previous */                 
                                /* strtok() left off */

最後に、display_grid()次のように変更します。


int i, j;

for(i = 0; i < 3; i++)
{
    for(j = 0; j < 4; j++)
        printf("%d ", ar[i][j]);
    printf("\n");
}

以上のことをすべて踏まえて、私はいくつかのことを指摘しなければなりません。

  • Cでは、型キャストmallocは不要です。詳細については、こちらをお読みください。
  • コードの問題-行と列の数が変更された場合、それらの変更に対応するのに問題が発生します。#define行と列の数をお勧めし、それらの定義を全体で使用します。
  • メモリリークの状況を回避するために、最後に割り当てられたメモリを解放してくださいdisplay_grid()
  • コードに未使用の変数がいくつかあります。(それは私のような気まぐれな人々を悩ませます。)
  • ファイルポインタを回る必要はありません。ファイルポインタのみget_grid()が必要です。もちろん、ニーズが進化した場合は、このステートメントを無視してください。
于 2013-02-19T06:40:07.260 に答える