動的メモリ管理が必要で、 fgets
を使用します 行を読み取る関数。ただ、何文字読んだか見る方法はないようです。したがって、fgetc を使用します:
char * getline(void) {
char * line = malloc(100), * linep = line;
size_t lenmax = 100, len = lenmax;
int c;
if(line == NULL)
return NULL;
for(;;) {
c = fgetc(stdin);
if(c == EOF)
break;
if(--len == 0) {
len = lenmax;
char * linen = realloc(linep, lenmax *= 2);
if(linen == NULL) {
free(linep);
return NULL;
}
line = linen + (line - linep);
linep = linen;
}
if((*line++ = c) == '\n')
break;
}
*line = '\0';
return linep;
}
注意 :gets は絶対に使用しないでください。境界チェックを行わず、バッファをオーバーフローさせる可能性があります
GNU C ライブラリまたは別の POSIX 準拠のライブラリを使用している場合は、getline()
を使用できます。 stdin
を渡します
静的割り当てのために行を読み取るための非常に単純だが安全でない実装:
char line[1024];
scanf("%[^\n]", line);
バッファ オーバーフローの可能性はなく、行全体を読み取れない可能性がある、より安全な実装は次のとおりです。
char line[1024];
scanf("%1023[^\n]", line);
変数の宣言で指定された長さとフォーマット文字列で指定された長さの「1 の違い」ではありません。歴史的遺物です。