当前位置: 首页 > news >正文

C++练习

 要求

1. 函数命名清晰

  • 使用描述性的命名,准确反映函数的功能。例如,使用 CalculateSum() 而不是 sum()
  • 避免使用缩写或模糊不清的名字,确保变量和函数名有明确的含义。

2. 参数传递

  • 根据需要选择按值传递按引用传递按指针传递
  • 如果参数不需要修改,可以使用 const 修饰,特别是指针或引用。
  • 参数的数量不宜过多,避免函数过于复杂。如果参数较多,可以考虑将其封装为结构体或类。

3. 错误处理

  • 考虑可能的边界情况(例如空输入、超出范围的值、特殊输入、指针判空等)。
  • 如果函数涉及资源分配(如内存、文件句柄等),注意资源的释放,防止内存泄漏。
  • 如果涉及到异常情况的处理,可以选择返回错误码或抛出异常,确保在出错时给出明确的反馈。

4. 返回值处理

  • 明确函数的返回类型。确保返回值类型与函数所要执行的逻辑相匹配。
  • 在有意义时,尽量避免返回全局变量或未初始化的值,防止产生不确定行为。

 实现内存拷⻉函数

char* strcpy(char* strDest, const char* strSrc);

char* strcpy(char *dst,const char *src) {// [1]源字符串参数⽤const修饰,防⽌修改源字符串。assert(dst != NULL && src != NULL); // [2]char *ret = dst; // [3]while ((*dst++=*src++)!='\0'); // [4]return ret;
}[2]:空指针检查:
(1)不检查指针的有效性,说明答题者不注重代码的健壮性。 
(2)检查指针的有效性时使⽤ assert(!dst && !src); char *转换为 bool 即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增⼤和维护成本升⾼。
(3)检查指针的有效性时使⽤ assert(dst != 0 && src != 0);
(4)直接使⽤常ᰁ(如本例中的0)会减少程序的可维护性。⽽使⽤NULL代替0,如果出现拼写错误,编译器就会检查出来。
[3] 返回⽬标地址: 
(1)忘记保存原始的strdst值。 
[4] '\0':
(1)循环写成 while (*dst++=*src++); 明显是错误的。 
(2)循环写成 while (*src!='\0') *dst++ = *src++; 
循环体结束后,dst字符串的末尾没有正确地加上'\0'。
(3)为什么要返回char *? 
返回dst的原始值使函数能够⽀持链式表达式

实现String类

String.h

#ifndef STRING_H_
#define STRING_H_
#include<iostream>
using std::ostream;
using std::istream;class String{
private:char * str;int len;static in num_strings;static const int    CINLIM =80;
public:String(const char * s);String();String(const String &);~String();int length() const {return len;}String & operator=(const String &);String & operator=(const char *);char & operator[](int i);const char & operator[](int i) const;friend bool operator<(const String &st, const String &st2);friend bool operator>(const String &st1, const String &st2);friend bool operator==(const String &st, const String &st2);friend ostream & operator<<(ostream & os, const String & st);friend istream & operator>>(istream & is, String & st);static int HowMany();
};
#endif

String.cpp

#include<cstring>
#include"string.h"
using std::cin;
using std::cout;int String::num_strings = 0    //初始化静态成员变量int String::HoMany()    //静态成员函数
{return num_strings;
}String::String(const char * s)    //char转成String,构造函数,参数为指针
{len = std::strlen(s);str = new char[len + 1];std::strcpy(str, s);num_strings++;
}String::String()    //默认构造函数
{len = 4;str = new char[1];str[0] = '\0';num_string++;
}String::String(const String & st)    //拷贝构造函数
{num_strings++;len = st.len;str = new char[len+1];std::strcpy(str, st.str);
}String::~String()
{--num_strings;delete[] str;
}String & String::operator=(const String & st)
{if(this == &st)return *this;delete [] str;len = st.len;str = new char[len + 1];std::strcpy(str, st.str);return *this;
}String & String::operator=(const char * s)
{delete [] str;len = std::strlen(s);str = new char[len + 1];std::strcpy(str, s);return *this;
}char & String::operator[](int i)
{return str[i];
}const chat & String::operator[](int i) const
{return str[i];
}//友元
bool operator<(const String &st1, const String &st2)
{return (std::strcmp(st1.str, st2.str) < 0);
}bool operator>(const String &st1, const String &st2)
{return st2 < st1;
}bool operator==(const String & st1, const String &st2)
{return (std::strcmp(st1.str, st2.str) == 0);
}ostream & operator<<(ostream & os, const String & st)
{os << st.str;return os;
}istream & operator>>(istream & is, String & st)
{char tem[String::[CINLIM];is.get(remp, String::CINLIM);if(is)st = temp;while(is && is.get() != '\n')continue;return is;
}

strcpy()

char *strcpy(char *strDest, const char *strSrc)
{assert((strDest != nullptr) && (strSrc != nullptr));char *address == strDest;while((#strDest++ = * strSrc++) != '\');return address;
}

strlen()

int strlen(const char *str)
{assert(strt != nullptr);int len;while((*str++) != '\0'){len++;}return len;
}

strcat()

char *strcat(char * dest, const char *src)
{assert(dest && src);char * ret = dest;while(*dest){dest++;}while(*dest++ = * src++){}return ret;
}

strcmp()

int strcmp(const char *str1, const char * str2)
{assert(str && str2);while(*str1 && *str2 && (*str1 == *str2)){str1++;str2++;}return *str1 - *str2;
}

相关文章:

C++练习

要求 1. 函数命名清晰 使用描述性的命名&#xff0c;准确反映函数的功能。例如&#xff0c;使用 CalculateSum() 而不是 sum()。避免使用缩写或模糊不清的名字&#xff0c;确保变量和函数名有明确的含义。 2. 参数传递 根据需要选择按值传递、按引用传递或按指针传递。如果…...

3. GIS后端工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…...

Linux学习笔记(4)----Debian压力测试方法

使用命令行终端压力测试需要两个实用工具&#xff1a;s-tui和stress sudo apt install s-tui stress 安装完成后&#xff0c;在终端中启动 s-tui实用工具&#xff1a; s-tui 执行后如下图&#xff1a; 你可以使用鼠标或键盘箭头键浏览菜单&#xff0c;然后点击“压力选项(Str…...

xml详解

一、XML是什么 XML&#xff08;可扩展标记语言&#xff09;是一种非常常用的数据存储和交换格式。 二、XML 的基本结构 声明 XML 文件通常以 XML 声明开始&#xff0c;例如&#xff1a;<?xml version"1.0" encoding"UTF-8"?>。它指定了 XML 的版…...

C140 杨辉三角

C140 杨辉三角 题目题解(94)讨论(102)排行面经 new 简单 通过率&#xff1a;29.57% 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 知识点C工程师牛客 校招时部分企业笔试将禁止编程题跳出页面&#xff0c;为提前适应&#xff0c;练习时请使用在线自测&#xff0c;…...

C++字符串操作中的陷阱

休对故人思故国&#xff0c;且将新火试新茶。诗酒趁年华。 ——《望江南超然台作》【宋】苏轼 目录 正文&#xff1a; 首先我们要明白出现问题的原因: 1. 缓冲区溢出 2. 错误的字符串声明方式 3. 缺乏对NULL指针的检查 解决方案&#xff1a; 下期预告&#xff1a;C字符串…...

最值求解 | 管理类联考数学专项

日期内容2024.9.5新建2024.9.6曦曦求最值完结 实数求最值至少至多抽屉原理工程问题线性规划一次性绝对值求最值 参考&#xff1a; b站跟着曦曦老师玩转【最值】...

C++_继承详解

继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能。继承呈现了面向对象程序设计的层次结构&#xff0c;之前我们接触的复用都是函数复用&#xff0c;今天我们所讨…...

区块链开发解决方案有哪些

区块链开发解决方案概述 区块链开发解决方案旨在利用区块链技术构建和开发新型应用和系统&#xff0c;以解决各种业务问题和提升效率。区块链作为一种基于密码学的分布式账本技术&#xff0c;通过将交易和数据记录在不可篡改的区块中&#xff0c;并通过网络中的多个节点共同验…...

Express与SQLite集成教程:轻松实现数据库操作

Express使用SQLite的教程可以大致分为以下几个步骤。以下是一个详细的指南&#xff0c;帮助你在Express项目中集成SQLite数据库。 1. 安装必要的库 首先&#xff0c;你需要在你的Express项目中安装sqlite3库。打开终端或命令提示符&#xff0c;切换到你的项目目录&#xff0c…...

Transforms的常见用法

文章目录 一、封装函数与普通函数的用法区别二、Image.open()打开图片的格式三、ToTensor打开图片格式四、ToTensor使用五、Normalize归一化使用六、Resize的使用七、Compose - Resize 使用八、RandomCrop&#xff08;&#xff09; 随机裁剪用法 一、封装函数与普通函数的用法区…...

js 创建 React 项目

起因(目的): js 很久没写了。 react js 之前粗略看过, 最近又需要用到, 继续学习&#xff0c; 记录 积累。 1. 新建 React 项目 的几种方法。 官方建议使用 next 来创建 React 项目&#xff0c; 但是我觉得太复杂了。以后再看看. npx create-next-applatest # !!! 不建议使…...

WPF 中常用 `Transform` 类的介绍、使用示例和适用场景

WPF 中常用 Transform 类的介绍、使用示例和适用场景 使用场景解释代码示例示例代码解释 Transform 类描述使用示例适用场景TranslateTransform用于沿 X 轴或 Y 轴平移&#xff08;移动&#xff09;元素。xml <TranslateTransform X"50" Y"100" />移…...

ElasticSearch-DSL

查询所有 match_all 分页查询 from size深分页查询 Scroll指定字段排序 sort返回指定字段_sourcematch 短语查询 match_phrase多字段查询 multi_matchquery_string simple_query_string 关键词查询 Term 结构化搜索 前缀查询 prefix通配符查询 wildcard范围查询 range多 id 查…...

Learn ComputeShader 07 Post Processing

这次我们将使用计算机着色器对图像进行后处理。 要进行后处理需要将渲染图像从cpu传递给gpu&#xff0c;并在gpu对图像进行处理然后传回cpu。 首先创建一个后处理基类BasePP 首先声明需要用到的属性。 using System.Collections; using System.Collections.Generic; using …...

初始QT!

作业&#xff1a;了解QT文件夹初始代码的意义 QT core gui #QT工程所需得类库 core是核心库 gui图形化界面相关库类 greaterThan(QT_MAJOR_VERSION, 4): QT widgets #版本超过4.0会加上widgetsCONFIG c11 #该编辑器支持c11后的版本 # The following define makes you…...

全国大学生数据建模比赛——深度学习

全国大学生数学建模比赛中&#xff0c;深度学习可以成为解决复杂问题的有力手段。 一、深度学习的优势在比赛中的体现 强大的模式识别能力&#xff1a;深度学习模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;&#xff0…...

Qt技巧(二)-滑动界面,轮询控件,循环操作控件

在Qt界面开发过程中&#xff0c;我们常常要对同类部件&#xff0c;具有同样功能的一系列部件进行操作&#xff0c;比如&#xff1a; 这个页面该怎么设计&#xff0c;中间的几个选项该怎么操作&#xff1f; 我们在主工程中添加一个设计师界面类&#xff0c;类名设置为“BrandF…...

003——单链表

1.链式存储的特点 逻辑&#xff08;通过指针实现&#xff09;上相邻&#xff0c;物理上可相邻可不相邻 2.结点&#xff08;节点都可以&#xff09; 4&#xff08;&8&#xff09; 8&#xff08;&6&#xff09; 6&#xff08;&1&#xff09; 1&#xff08;&…...

XILINX平台下LINUX DMA驱动调研

专栏目录 高质量文章导航-持续更新中-CSDN博客 基础概念 VA:virtual address称为虚拟地址, PA:physical address称为物理地址。 CPU通过地址来访问内存中的单元,如果CPU没有MMU,或者有MMU但没有启动,那么CPU内核在取指令或者访问内存时发出的地址(此时必须是物理地址…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

aurora与pcie的数据高速传输

设备&#xff1a;zynq7100&#xff1b; 开发环境&#xff1a;window&#xff1b; vivado版本&#xff1a;2021.1&#xff1b; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程&#xff0c;pc通过pcie传输给fpga&#xff0c;fpga再通过aur…...