復習:Stringラッパー
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 16/61。
チャレンジ
簡単動的に割り当てられた文字配列をラップする StringObject モジュールを構築しましょう。この復習チャレンジでは、完全なオブジェクトのライフサイクル、コンストラクター、読み取り専用メソッド、デストラクターを組み合わせ、それらを連携させて安全に memory を管理します。
3つのファイルを作成します。
stringobj.h: 1つのmemberを持つStringObjectstructをDeclareします。そのmemberはchar *text(動的に割り当てられたstringへのpointer)です。また、3つのfunctionもDeclareします。create_string:const char *のinputを受け取り、新しく割り当てられた StringObject へのpointerを返しますprint_string:const StringObject *を受け取り、保存されたテキストをdisplaysしますfree_string:StringObject *を受け取り、割り当てられたすべてのmemoryを解放します
STRINGOBJ_Hを使用してインクルードガードを設定します。stringobj.c: 3つすべてのfunctionをImplementします。コンストラクターでは、まずstruct用のmemoryを割り当て、次にテキスト用のmemoryを割り当て(null終端文字の分としてstrlenに1を加えることを忘れないでください)、inputstringをコピーします。デストラクターでは逆の順序でFreeする必要があります。最初に内部のtextbufferを、次にstruct自体をFreeします。safetyのため、デストラクターにNULLチェックを含めます。main.c: モジュールを使用してstringオブジェクトを作成し、その内容をdisplaysしてから、適切にクリーンアップします。
StringObject に保存する1つの入力、つまりtext stringを受け取ります。
main ファイルで、提供されたテキストを使用して StringObject を作成し、その内容を出力し、memory を解放してから、確認メッセージを出力します。
print_string function は、次の形式で出力します。
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: Create a StringObject with the input text
// TODO: print_string を使用して文字列を出力する
// TODO: Free the StringObject using free_string
// TODO: クリーンアップを確認するために "Freed" を出力する
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ