Menu
Coddy logo textTech

復習:Stringラッパー

CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 16/61。

challenge icon

チャレンジ

簡単

動的に割り当てられた文字配列をラップする StringObject モジュールを作成しましょう。この復習チャレンジでは、メモリを安全に管理するために、コンストラクタ、読み取り専用メソッド、デストラクタというオブジェクトのライフサイクル全体を統合します。

3つのファイルを作成します:

  • stringobj.h: char *text(動的に割り当てられた文字列へのポインタ)という単一のメンバを持つ StringObject 構造体を宣言します。また、以下の3つの関数を宣言します:
    • create_stringconst char * の入力を受け取り、新しく割り当てられた StringObject へのポインタを返します
    • print_stringconst StringObject * を受け取り、格納されているテキストを表示します
    • free_stringStringObject * を受け取り、割り当てられたすべてのメモリを解放します
    シンボル 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;
}

Object Oriented Programmingのすべてのレッスン