キーボードから入力される文字を改行が入力される (あるいは 1 文字が取得できな
い) まで全て取得した文字列 (ただし、文字列に改行は含まず (終端として nul 文
字を入れる)) を動的に作成、その先頭アドレスを返す関数 char *mygets(void)
を作成し、main 関数で呼び出して戻り値 (アドレス) を文字列として表示した後
解放するプログラムを作成せよ。。(1 文字ずつ取っては改行か確認し、realloc() で
長くしていく。)
この問題の解き方が測りません。
ポインタ
Re: ポインタ
realloc を使う解き方が分からないのなら、
固定長(例えば 1024バイト)のバッファを持ち、そこに 1文字ずつ読み込んで、
改行が入力されたら、必要な長さの領域を malloc で確保して、バッファから
文字をコピーし、確保した領域のアドレスを返す関数 mygets なら書けますか?
それが書けたら、realloc を使う解き方をお教えしましょう。
固定長のバッファを持たないで、任意長の入力を読み込めるプログラムを
書いてみました。ただし、これは模範解答ではありません。
#include <stdio.h> // getchar, printf
#include <stdlib.h> // malloc, free
char *rgets(int n)
{
char *p = NULL;
int c = getchar();
if (c == EOF) (n != 0 && (p = malloc(n + 1))) && (p[n] = '\0');
else if (c == '\n') (p = malloc(n + 1)) && (p[n] = '\0');
else (p = rgets(n + 1)) && (p[n] = c);
return p;
}
char *mygets(void) { return rgets(0); }
int main(void)
{
char *p;
while (p = mygets()) {
printf("[%s]\n", p);
free(p);
}
}