c语言实现简单的string

文章目录

  • 前言
  • 一、注意事项
  • 二、代码
  • valgrind扫描
  • 总结


前言

在c语言中利用面向对象的编程方式,实现类似c++中的string类。


一、注意事项

所有与string结构体相关的函数全都没有返回值。
在c++中,当产生临时对象时编译器会自动的加入析构函数,销毁临时变量;但是C语言中必须手动显示的写出析构函数,当string结构体相关函数返回临时变量时,必须降临时变量显示赋值,或者当场调用析构函数,否则非常容易造成内存泄露。索性就都没有返回值。

二、代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>/*** 若对string相关函数提供返回值则非常容易造成内存泄露,因此所有函数都不提供返回值
*/typedef struct _string
{char* ptr;int num;
} string;
void string_Ctor(string* s)
{memset(s, 0, sizeof(string));
}
void string_Dtor(string* s)
{free(s->ptr);memset(s, 0, sizeof(string));
}
void string_add(string* all, string s1, string s2)
{string sum; string_Ctor(&sum);sum.num = s1.num + s2.num;sum.ptr = (char*)malloc(sum.num + 1);memcpy(sum.ptr, s1.ptr, s1.num);memcpy(sum.ptr+s1.num, s2.ptr, s2.num);sum.ptr[sum.num] = '\0';string_Dtor(all);*all = sum;
}
void string_assign_s_p(string* str, char* ptr)
{if (str->ptr == ptr) return;string_Dtor(str);str->num = strlen(ptr);str->ptr = (char*)malloc(str->num+1);memcpy(str->ptr, ptr, strlen(ptr));str->ptr[str->num] = '\0';
}
void string_assign_s_s(string* str1, string* str2)
{if (str1 == str2) return;string_Dtor(str1);str1->num = str2->num;str1->ptr = (char*)malloc(str1->num + 1);memcpy(str1->ptr, str2->ptr, str1->num);str1->ptr[str1->num] = '\0';
}
void string_add_assign(string* str1, string* str2)
{if (str1 == str2) return;string sum; string_Ctor(&sum);string_add(&sum, *str1, *str2);string_Dtor(str1);*str1 = sum;
}int main() {string http_head, http_body, http_msg;string_Ctor(&http_head); string_Ctor(&http_body); string_Ctor(&http_msg);string_assign_s_p(&http_head, "abc""def");string_assign_s_p(&http_msg, "jskldfj;laskjdflkj");string_add_assign(&http_msg, &http_head);string_assign_s_s(&http_body, &http_msg);string_add(&http_head, http_body, http_msg);printf("%s\n", http_head.ptr);string_Dtor(&http_head); string_Dtor(&http_body); string_Dtor(&http_msg);
}

valgrind扫描

Valgrind——c/c++内存检测工具

==23054== Memcheck, a memory error detector
==23054== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==23054== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==23054== Command: ./a.out
==23054== Parent PID: 18533
==23054== 
==23054== 
==23054== HEAP SUMMARY:
==23054==     in use at exit: 0 bytes in 0 blocks
==23054==   total heap usage: 6 allocs, 6 frees, 1,149 bytes allocated
==23054== 
==23054== All heap blocks were freed -- no leaks are possible
==23054== 
==23054== For lists of detected and suppressed errors, rerun with: -s
==23054== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

总结

虽然可以利用面向对象的思想实现类似的c++中的string类,但是由于受到c语言语法的限制,不能像写c++一样写C,如析构函数必须显示写出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/169824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Walrus 入门教程:如何创建模板以沉淀可复用的团队最佳实践

模板是 Walrus 的核心功能之一&#xff0c;模板创建完成后用户可以重复使用&#xff0c;并在使用过程中逐渐沉淀研发和运维团队的最佳实践&#xff0c;进一步简化服务及资源的部署。用户可以使用 HCL 语言自定义创建模板&#xff0c;也可以一键复用 Terraform 社区中上万个成熟…

云原生安全工具汇总(docker、k8s、Kubernetes、Git仓库)

目录 Metarget:云原生靶机环境 CDK:容器环境定制的渗透测试工具 container-escape-check:容器逃逸检测

synchronized在代码中的用法

synchronized可以对两种对象加锁&#xff1a;实例对象和类对象。下边先说对类对象加锁的代码&#xff1a; 第1是修饰static方法&#xff0c;第2种是直接锁类的class对象&#xff1b; /*** title: SynchronizedStaticDemo1* description: synchronized 对类加锁1* author: * d…

【Python百宝箱】Python数据探险:Excel与数据科学的完美结合

前言 在当今信息爆炸的时代&#xff0c;数据处理和分析已经成为各行各业不可或缺的一部分。在众多数据处理工具中&#xff0c;Python以其简洁而强大的语法成为数据科学家和分析师的首选之一。本文将深入探讨与电子表格处理相关的Python库&#xff0c;介绍它们的功能、应用场景…

批量按顺序1、2、3...重命名所有文件夹里的文件

最新&#xff1a; 最快方法&#xff1a;先用这个教程http://文件重命名1,2......nhttps://jingyan.baidu.com/article/495ba841281b7079b20ede2c.html再用这个教程去空格&#xff1a;利用批处理去掉文件名中的空格-百度经验 (baidu.com) 以下为原回答 注意文件名有空格会失败…

LeetCode Hot100 105.从前序与中序遍历序列构造二叉树

题目&#xff1a;给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 代码&#xff1a; class Solution {private Map<Integer, Integer> indexM…

ESP32网络开发实例-远程Web串口监视器

远程Web串口监视器 文章目录 远程Web串口监视器1、应用介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将构建一个 ESP32 网络服务器,用作远程串行监视器。 基于 Web 的串行监视器的工作方式与通常用于调试目的的 Arduino IDE 串行监视器的工作方式相同。 1、应用介绍 …

数字逻辑电路基础-时序逻辑电路之移位寄存器

文章目录 一、移位寄存器定义二、verilog源码三、仿真结果一、移位寄存器定义 移位寄存器定义 A shift register is a type of digital circuit using a cascade of flip flops where the output of one flip-flop is connected to the input of the next. 移位寄存器是一种将…

docker部署MySQL5.7设置密码和远程访问的方法

运行MySQL docker run -p 3306:3306 --name mysql57 -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORDD7txumqc2b! -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8…

c++八股文记录

八股文 1.类和结构体的区别 在 C 中&#xff0c;类&#xff08;class&#xff09;和结构体&#xff08;struct&#xff09;在语法上几乎是相同的&#xff0c;唯一的区别是默认的访问权限。在结构体中&#xff0c;默认的访问权限是公有的&#xff08;public&#xff09;&#x…

基于51单片机超市快递寄存自动柜设计源程序

一、系统方案 1、本设计采用这51单片机作为主控器。 2、存包&#xff0c;GSM短信取件码。 3、液晶1620显示。 4、矩阵键盘输入取件码&#xff0c;完成取包。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /******************************…

python基于flask_sockets实现WebSocket

WebSocket是啥&#xff1f; WebSocket是HTML5引入的新的通信协议&#xff0c;主要由Web客户端和服务器实现&#xff0c;当然它也可以在Web之外实现。 与HTTP连接不同&#xff0c;WebSocket连接是客户端和服务器之间永久的双向通信通道&#xff0c;其中任何一个都可以启动交换。…

量子计算的发展

目录 一、量子力学的发展历程二、量子计算的发展历程三、量子计算机的发展历程四、量子信息科学的发展 一、量子力学的发展历程 量子力学是现代物理学的一个基本分支&#xff0c;它的发展始于20世纪初。以下是量子力学发展的几个重要阶段&#xff1a; 普朗克&#xff08;1900&…

steam搬砖还能做吗?CSGO饰品未来走势如何?

steam/csgo搬砖项目真能月入过万吗&#xff1f;到底真的假的&#xff1f; 如何看待CSGO饰品市场的整体走向&#xff1f; 从整体来说&#xff0c;CSGO的饰品市场与规模肯定会持续不断的上升&#xff0c;大盘不会发生特别大的波动&#xff0c;目前处于稳定期&#xff01;&#x…

WGCLOUD 中文繁体版本 下载

wgcloud 繁体版下载 下載繁體版安裝包 - WGCLOUD

Compose入门

​ 本篇文章主要是为了对Compose有一个初步了解。知道Compose是做什么的&#xff0c;用Compose能干什么&#xff0c;在目前的各种UI框架下面有些优势&#xff0c;参考Google官网的解释加上一些自己的理解生成的一篇文章。本人也是Compose初学者&#xff0c;通过每一步学习遇到哪…

centos环境处理音频格式

# SoX 安装和ffmpeg安装 比如手机录音.m4a格式需要使用ffmpeg转换 1.SoX 安装 SoX 工具在大部分 Linux 系统上可以直接通过软件包管理器安装&#xff0c;命令如下&#xff1a;sudo apt-get install sox Mac 系统上则可以使用安装命令如下&#xff1a;brew install sox soxi…

今天先水一章

水贴&#xff0c;可自动忽略

【Qt之QFileInfo】使用

描述 QFileInfo类提供了与系统无关的文件信息。 QFileInfo提供有关文件的名称和位置&#xff08;路径&#xff09;在文件系统中的信息&#xff0c;以及它的访问权限、是否为目录或符号链接等。还可以获取文件的大小和最后修改/读取时间。QFileInfo还可以用于获取关于Qt资源的信…

c语言编程题经典100例——(21~25例)

1&#xff0c;求一个立方数的和 以下是一个求立方数之和的C语言程序示例&#xff1a; #include <stdio.h> int main() { int n, sum 0; printf("请输入一个正整数n&#xff1a;"); scanf("%d", &n); for (int i 1; i < n; i) { sum…