入力の終わりまで可変長のstdinから行を読みたいと思います。入力例は、次のようなものになります。行の長さを知らずにstdinからCの2d配列に行を読み取る
#.###############
#...#...........#
#.###.#####.#.###
#...........#...#
###############.#
ただし、行と列の長さはさまざまです。
文字を文字として読むことを除いて、2次元配列に読み込む最良の方法は何ですか?
入力の終わりまで可変長のstdinから行を読みたいと思います。入力例は、次のようなものになります。行の長さを知らずにstdinからCの2d配列に行を読み取る
#.###############
#...#...........#
#.###.#####.#.###
#...........#...#
###############.#
ただし、行と列の長さはさまざまです。
文字を文字として読むことを除いて、2次元配列に読み込む最良の方法は何ですか?
POSIX準拠のシステムで動作していると仮定すると、the getline()
functionを使用して、ほとんど任意の長さのラインを読み取ることができます(使用可能なメモリによってのみ制限されます)。このような何か作業をする必要があります:
char *line = NULL;
size_t bytes = 0UL;
for (int ii = 0;; ii++)
{
ssize_t bytesRead = getline(&line, &bytes, stdin);
if (bytesRead <= 0L)
{
break;
}
lineArray[ ii ] = strdup(line);
}
free(line);
あなた自身をエラーチェックを追加し、lineArray
の世話をする必要があります。
char *buff = malloc(1024 * 100); // 100K should be plenty, tweak as desired.
char *maze = 0;
int width = 0,
int height = 0;
FILE *fp = fopen(input.txt, "r");
fgets(buff, 1024 * 100, fp);
if(!strchr(buff, '\n'))
goto failed_sanity_test;
striptrailingwhitespace(buff);
if(height == 0)
width = strlen(buff);
/* sanity-test width ? */
else
if(strlen(buff) != width)
goto ragged_edge_maze;
temp = realloc(maze, width * (height + 1));
if(!temp)
goto out_of_memory;
maze = temp;
memcpy(maze + height * width, buff, width);
height++;
多くの他の言語と比較してC言語では似ていますが、少なくともエラー状態を完全に制御できます。
行の数や各行の長さが分からない場合は、文字で文字を読み込んで改行を確認するよりも、選択肢がありません。 –
ありがとう...私はそう思っていました...しかし、私は割り当てを得て、自動テストは私の解決策を取らず、私は文字の代わりに全体の行を読むべきだとアドバイスしました:( –
あなたは正確な長さ何千もの文字でなければ、大規模な配列を持ち、 'fgets'を使うことができます。POSIXシステム(LinuxやmacOSなど)を使っているなら、あなたは 'getline'を[Andew Henleの回答](http://stackoverflow.com/a/40931560/440558)として使うことができます。 –