Menu
CoddyTech

回顾:字符串包装类

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 16 课,共 61 课。

challenge icon

挑战

简单

让我们构建一个 StringObject 模块,用来封装动态分配的字符数组。这个回顾挑战将完整的对象生命周期、构造函数、只读方法和析构函数结合起来,共同安全地管理内存。

你将创建三个文件:

  • stringobj.h:声明一个 StringObject 结构体,其中只有一个成员:char *text(指向动态分配的字符串的指针)。还要声明三个函数:
    • create_string:接收一个 const char * 输入,并返回指向新分配的 StringObject 的指针
    • print_string:接收一个 const StringObject *,并显示存储的文本
    • free_string:接收一个 StringObject *,并释放所有已分配的内存
    使用符号 STRINGOBJ_H 设置包含保护。
  • stringobj.c:实现这三个函数。构造函数应先为结构体分配内存,再为文本分配内存(记得分配 strlen 加 1 个字节,用于空终止符),然后复制输入字符串。析构函数必须按相反的顺序释放内存:先释放内部的 text 缓冲区,再释放结构体本身。为确保安全,请在析构函数中检查 NULL。
  • main.c:使用你的模块创建一个字符串对象,显示其内容,然后正确地清理内存。

你将收到一个输入:要存储在 StringObject 中的文本字符串。

在 main 文件中,使用提供的文本创建一个 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;
}

面向对象编程中的所有课

自己练习: C 在线编译器