2016-12-02 4 views
-1

入力の終わりまで可変長のstdinから行を読みたいと思います。入力例は、次のようなものになります。行の長さを知らずにstdinからCの2d配列に行を読み取る

#.############### 
#...#...........# 
#.###.#####.#.### 
#...........#...# 
###############.# 

ただし、行と列の長さはさまざまです。

文字を文字として読むことを除いて、2次元配列に読み込む最良の方法は何ですか?

+1

行の数や各行の長さが分からない場合は、文字で文字を読み込んで改行を確認するよりも、選択肢がありません。 –

+0

ありがとう...私はそう思っていました...しかし、私は割り当てを得て、自動テストは私の解決策を取らず、私は文字の代わりに全体の行を読むべきだとアドバイスしました:( –

+0

あなたは正確な長さ何千もの文字でなければ、大規模な配列を持ち、 'fgets'を使うことができます。POSIXシステム(LinuxやmacOSなど)を使っているなら、あなたは 'getline'を[Andew Henleの回答](http://stackoverflow.com/a/40931560/440558)として使うことができます。 –

答えて

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の世話をする必要があります。

0
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言語では似ていますが、少なくともエラー状態を完全に制御できます。

関連する問題