山本さん太郎 さんが書きました:テキストがあり、その半分の行の文字を配列Aにコピーするようなプログラムの、char text[][]を動的確保したいのですがどのようにすればよろしいでしょうか?
fscanf の "%s" で読み込むのは、行ではなく、空白文字で区切られた文字列です。
入力ファイルに空行があったり、1行に複数の文字列があれば、半分の行という
ことにはなりません。
fscanf で読むということで、奇数個の文字列なら真ん中の文字列、
偶数個の文字列なら後半の先頭の文字列ということにします。
それでよろしいでしょうか?
コード:
#include <stdio.h> // FILE, fopen, fclose, fscanf, puts
#include <stdlib.h> // malloc, free
#include <string.h> // strdup
int main(void)
{
FILE *fp;
int len, i;
char *fn = "test";
char **text;
char A[500];
fp = fopen(fn, "r");
if (!fp) return puts("can't open"), 1;
for (len = 0; fscanf(fp, "%499s", A) == 1; len++) ;
text = malloc(sizeof(char*) * len);
if (!text) return puts("out of memory"), 2;
rewind(fp);
for (i = 0; i < len; i++) {
fscanf(fp, "%s", A);
text[i] = strdup(A); // 内部で malloc() を使用
if (!text[i]) return puts("out of memory"), 3;
}
fclose(fp);
strcpy(A, text[len/2]);
puts(A);
for (i = 0; i < len; i++) free(text[i]);
free(text);
return 0;
}
まず、全部を空読みして文字列の個数を取得します。それから、
その個数分の (char *) を確保し、その先頭アドレスを text に入れています。
strdup は文字列の格納に必要なサイズの領域を malloc で確保し、
そこに文字列を入れてくれます。