復習:Stringラッパー
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 16/61。
チャレンジ
簡単動的に割り当てられた文字配列をラップする StringObject モジュールを作成しましょう。この復習チャレンジでは、メモリを安全に管理するために、コンストラクタ、読み取り専用メソッド、デストラクタというオブジェクトのライフサイクル全体を統合します。
3つのファイルを作成します:
stringobj.h:char *text(動的に割り当てられた文字列へのポインタ)という単一のメンバを持つStringObject構造体を宣言します。また、以下の3つの関数を宣言します:create_string—const char *の入力を受け取り、新しく割り当てられた StringObject へのポインタを返しますprint_string—const StringObject *を受け取り、格納されているテキストを表示しますfree_string—StringObject *を受け取り、割り当てられたすべてのメモリを解放します
STRINGOBJ_Hを使用してインクルードガードを記述してください。stringobj.c: 3つの関数すべてを実装します。コンストラクタでは、構造体のメモリを割り当て、次にテキストのメモリを割り当て(strlenにヌル終端文字分の1を加えることを忘れないでください)、入力文字列をコピーします。デストラクタでは、逆の順序で解放する必要があります。まず内部のtextバッファを解放し、次に構造体自体を解放します。安全のために、デストラクタに NULL チェックを含めてください。main.c: モジュールを使用して文字列オブジェクトを作成し、その内容を表示してから、適切にクリーンアップを行います。
1つの入力を受け取ります:StringObject に格納する text string です。
メインファイルで、提供されたテキストを使用して StringObject を作成し、その内容を印刷し、メモリを解放してから、確認メッセージを印刷してください。
print_string 関数は、次の形式で出力する必要があります:
Text: {text}解放後、次のように印刷してください:
Freed例えば、入力が Hello World の場合、出力は次のようになります:
Text: Hello World
Freed自分で試してみよう
#include <stdio.h>
#include "stringobj.h"
int main() {
char input[256];
fgets(input, sizeof(input), stdin);
// 改行が含まれている場合は削除する
int len = 0;
while (input[len] != '\0') len++;
if (len > 0 && input[len - 1] == '\n') {
input[len - 1] = '\0';
}
// TODO: 入力テキストを使用してStringObjectを作成する
// TODO: print_stringを使用して文字列を出力する
// TODO: free_stringを使用してStringObjectを解放する
// TODO: クリーンアップを確認するために"Freed"を出力する
return 0;
}