ポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tukemen
記事: 1
登録日時: 4年前

ポインタ

#1

投稿記事 by tukemen » 4年前

キーボードから入力される文字を改行が入力される (あるいは 1 文字が取得できな
い) まで全て取得した文字列 (ただし、文字列に改行は含まず (終端として nul 文
字を入れる)) を動的に作成、その先頭アドレスを返す関数 char *mygets(void)
を作成し、main 関数で呼び出して戻り値 (アドレス) を文字列として表示した後
解放するプログラムを作成せよ。。(1 文字ずつ取っては改行か確認し、realloc() で
長くしていく。)
この問題の解き方が測りません。

かずま

Re: ポインタ

#2

投稿記事 by かずま » 4年前

tukemen さんが書きました:
4年前
この問題の解き方が測りません。
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);
	}
}

返信

“C言語何でも質問掲示板” へ戻る