【实验5】c++MyString类实现
如何用c语言实现CString的构造函数、析构函数和赋值函数?

如何⽤c语⾔实现CString的构造函数、析构函数和赋值函数?编写类String的构造函数、析构函数和赋值函数已知类String的原型为:class String{public:String(const char*str=NULL);//普通构造函数String(const String&other); //拷贝构造函数~String(void); //构析函数String&operate=(const String&other); //赋值函数Private:Char *m_data; //⽤于保存字符串};请编写String的上述4个函数。
String::String(const char*str=NULL){if(str == NULL){Init();return ;}int nLen = SafeStrlen(str) + 1;if (nLen != 1){m_data = new char[nLen];memset(m_data, 0, nLen);memcpy(m_data, lpsz, nLen*sizeof(char));}else Init();}String::String(const String&other){int len = SafeStrlen(other.m_data) + 1;m_data = new char[len];memset(m_data, 0, len);memcpy(m_data, other.m_data, len);}String::~String()// free any attached data{if(m_data)delete []m_data;}const String& String::operator=(const String& other){char* pOldData = m_data;int len = SafeStrlen(other.m_data) + 1;if( len != 1 ){m_data = new char[len];memset(m_data, 0, len);memcpy(m_data, other.m_data, len);if(pOldData) delete[]pOldData;return *this;}if(pOldData) delete[]pOldData;Init();return *this;}void String::Init(){m_data = new char[1];*m_data = '/0';}int String::SafeStrlen(LPCTSTR lpsz){return (lpsz == NULL) ? 0 : strlen(lpsz); }。
c语言中string的用法

c语言中string的用法在C语言中,字符串(string)是一组字符的序列,以null字符('\0')结尾。
字符串在实际编程中非常常见,因此了解如何使用字符串是至关重要的。
首先,我们可以使用字符数组来表示和处理字符串。
例如,我们可以声明一个字符数组来存储一个字符串:```cchar str[50] = "Hello, World!";```在上述例子中,我们声明了一个名为`str`的字符数组,大小为50,并将字符串"Hello, World!"赋值给它。
要注意的是,C语言中的字符串是以null字符('\0')结尾的,这个字符表示字符串的结束。
在声明和初始化字符数组时,编译器会自动在末尾添加null字符。
我们可以使用一个特殊的函数`strlen()`来获取字符串的长度。
该函数返回字符串中字符的数量,不包括null字符。
```cint length = strlen(str);```在上述示例中,我们将字符串`str`的长度存储在变量`length`中。
C语言中还提供了一些用于处理字符串的函数,例如`strcpy()`、`strcat()`和`strcmp()`等。
- `strcpy()`函数用于将一个字符串复制到另一个字符串中:```cchar destination[50];strcpy(destination, str);```在上述示例中,我们将`str`字符串复制到`destination`字符串中。
- `strcat()`函数用于将一个字符串附加到另一个字符串的末尾:```cchar str1[50] = "Hello, ";char str2[] = "World!";strcat(str1, str2);```在上述示例中,我们将`str2`字符串附加到`str1`字符串的末尾。
c++string 案例

c++string 案例《C String案例》一、概述C String是C语言中用于处理字符串的基本数据类型。
在C语言中,字符串通常以字符数组的形式存储,可以通过指针来访问和操作。
本案例将通过一个简单的示例来介绍C String的使用方法。
二、案例描述本案例将演示如何使用C String来创建一个简单的字符串,并进行一些基本的操作,如拼接、查找、替换和格式化等。
三、实现步骤1. 引入头文件:使用`<stdio.h>`头文件中的`printf()`函数和`string.h`头文件中的`strcpy()`函数等字符串操作函数。
2. 声明变量:声明一个字符数组变量`str`来存储字符串,以及一个指针变量`p`来指向字符串的起始位置。
3. 输入字符串:使用`scanf()`函数从用户输入中获取一个字符串,并将其存储在`str`变量中。
4. 输出原字符串:使用`printf()`函数输出原字符串,以便验证输入的正确性。
5. 拼接字符串:使用`strcat()`函数将一个子字符串拼接到原字符串的末尾。
6. 查找子字符串:使用`strstr()`函数查找指定子字符串在原字符串中的位置。
7. 替换子字符串:使用`strreplace()`函数替换原字符串中的指定子字符串。
8. 格式化字符串:使用`sprintf()`函数将一个浮点数格式化为字符串,并将其存储在`str`变量中。
9. 输出处理后的字符串:使用`printf()`函数输出处理后的字符串,以验证操作是否正确。
四、代码实现下面是一个简单的C代码实现,用于演示上述操作:```c#include <stdio.h>#include <string.h>int main() {char str[100]; // 声明字符数组变量str来存储字符串char *p = str; // 声明指针变量p指向str的起始位置char sub_str[] = "world"; // 子字符串float num = 3.14; // 浮点数int i;// 输入字符串并输出原字符串printf("请输入一个字符串:");scanf("%s", str);printf("原字符串为:%s\n", str);// 拼接字符串strcat(str, sub_str);printf("拼接后的字符串为:%s\n", str);// 查找子字符串并输出位置(如不存在则输出-1)i = strstr(str, sub_str);if (i != -1) {printf("子字符串位置:%d\n", i - p); // 计算子字符串在原字符串中的位置(从起始位置开始算起)} else {printf("未找到子字符串\n");}// 替换子字符串并输出替换后的结果(如不存在则不替换)if (strstr(str, "hello") != NULL) { // 检查是否需要替换子字符串 int j = strreplace(str, "hello", "world"); // 替换子字符串为"world"printf("替换后的结果为:%s\n", str); // 输出替换后的结果(包括替换后的新子字符串)} else {printf("未找到需要替换的子字符串\n");}// 格式化字符串并输出结果(如格式化失败则输出错误信息)if (sprintf(p, "%f", num) > 0) { // 将浮点数格式化为字符串并存储在p指向的位置上(不包括尾部的空字符)printf("格式化后的结果为:%s\n", p); // 输出格式化后的结果(包括格式化后的新子字符串)} else {printf("格式化失败\n"); // 输出错误信息(包括可能的错误原因)}return 0;}```五、运行结果及分析当运行上述代码时,程序将提示用户输入一个字符串,并根据要求进行一系列操作。
c语言string类的常用方法

c语言string类的常用方法在C语言中,字符串通常表示为字符数组,而不是像C++中的`std::string`类。
但我们可以使用一些函数来处理字符串,这些函数在``库中定义。
以下是C语言中处理字符串的一些常用方法:1. `strlen()`: 返回字符串的长度,不包括终止字符'\0'。
```csize_t len = strlen("Hello"); // len 为 5```2. `strcpy()`: 将一个字符串复制到另一个字符串。
```cchar src[] = "Hello";char dest[10];strcpy(dest, src); // dest 现在是 "Hello"```3. `strcat()`: 将一个字符串连接到另一个字符串的末尾。
```cchar src1[] = "Hello";char src2[] = ", World!";strcat(src1, src2); // src1 现在为 "Hello, World!" ```4. `strcmp()`: 比较两个字符串。
```cchar str1[] = "Hello";char str2[] = "World";if (strcmp(str1, str2) < 0) {printf("str1 is less than str2\n");} else if (strcmp(str1, str2) > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}```5. `strstr()`: 在字符串中查找子字符串。
c,,实验报告,用string类申明字符串对象实现数组的转置

c,,实验报告,用string类申明字符串对象实现数组的转置C++程序设计实验报告C++实验报告实验一1. 实验要求(1)编写一个函数把华氏温度转换为摄氏温度,转换公式如下C=(F-32)*5/9(2)编写重载函数Max1可分别求两个整数,三个整数,两个双精度数,三个双精度数的最大值。
(3)使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。
(4)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程2. 实验内容及实验步骤(1)编写函数float Convert(float TempFer),参数和返回值都为float类型,实现算法C=(F-32)*5/9,在main()函数中实现输入、输出。
程序名:lab3_1.cpp。
(2)分别编写四个同名函数max1,实现函数重载,在main()函数中测试函数功能。
程序名:lab3_2.cpp(3)在main()函数中提示输入两个整数x、y,使用cin语句得到x、y的值,调用pow(x,y)函数计算x的y次幂的结果,再显示出来。
程序名:lab3_4.cpp(4)编写递归函数int fib(int n),在主程序中输入n的值,调用fib函数计算Fibonacci级数。
公式为fib(n)=fib(n-1)+fib(n-2),n2;fib(1)=fib(2)=1。
使用if语句判断函数的出口,在程序中用cout语句输出提示信息。
程序名:(转载于: 写论文网:c,,实验报告,用string类申明字符串对象实现数组的转置)lab3_5.cpp(5)使用debug中的Step Into追踪到函数内部,观察函数的调用过程。
3.源程序Lab3_1#includeiostreamusing namespace std;float fun(float x){ float y;y=(x-32)*5/9;return y;}void main(){ float f,c;cout请输入华氏温度: ;cinf;c=fun(f);cout对应的摄氏温度为: cendl; }运行结果Lab3_2#includeiostreamusing namespace std;int Max1(int x,int y){ return (xy?x:y);}int Max1(int x,int y,int z){ int h,k;h=(xy?x:y);k=(hz?h:z);return k;}double Max1(double x,double y) {return (xy?x:y);}double Max1(double x,double y,double z) { double h,k;h=(xy?x:y);k=(hz?h:z);return k;}void main(){ int i,j,k;double l,m,n;cout请输入两个整数: ;cinij;cout最大数为: Max1(i,j)endl;cout请输入三个整数: ;cinijk;cout最大数为: Max1(i,j,k)endl;cout请输入两个双精度数: ;cinlm;cout最大数为: Max1(l,m)endl;cout请输入三个双精度数: ;cinlmn;cout最大数为: Max1(l,m,n)endl;}运行结果Lab3_3#includeiostream#includecmathusing namespace std; void main(){ double p,x,y;cinxy;p=pow(x,y);coutpendl;}运行结果Lab3_4#includeiostream.hint fib(int n);int main(){int n,answer;coutEnter number:endl; cinn;cout\n\n;answer=fib(n);coutansweris thenth Fibonacci number\nendl;return 0;}int fib(int n){coutProcessing fib(n)…endl;if(n3){coutReutrn 1!\n;return(1);}elsecoutCall fib(n-2)and fib(n-1).\nendl;return(fib(n-2)+fib(n-1));}运行结果4.实验体会其实这次实验涉及C++的内容并不多,主要练习的只是C++中的输入输出和重载函数的应用。
c++中string的常用方法及其功能

c++中string的常用方法及其功能摘要:1.C++ string 简介2.C++ string 常用方法概述- 构造函数与析构函数- 字符串操作方法- 字符串匹配与查找- 字符串编辑与转换3.具体方法详解- 字符串长度- 字符串切片- 字符串连接- 字符串查找- 字符串替换- 字符串大小写转换- 字符串编码和解码4.实战应用案例5.总结与拓展正文:C++中string的常用方法及其功能在C++编程中,string类是处理字符串的核心库。
它为开发者提供了许多实用的方法,使得字符串操作更加简单便捷。
本文将介绍C++ string类的常用方法及其功能,并给出实战应用案例。
1.C++ string 简介C++ string 类是C++ Standard Library 中的一个容器类,用于存储和处理字符串。
它提供了许多实用的方法,用于操作字符串,如构造、匹配、编辑等。
使用string 类可以让我们在编写程序时不再需要使用传统的C语言字符数组,从而降低了内存占用和编程复杂度。
2.C++ string 常用方法概述2.1 构造函数与析构函数string 类提供了多种构造函数,如默认构造函数、拷贝构造函数、从C字符串构造等。
析构函数用于在对象销毁时释放内存。
2.2 字符串操作方法string 类提供了许多用于操作字符串的方法,如:- length:获取字符串长度- size:获取字符串长度- empty:判断字符串是否为空- push_back:向字符串末尾添加字符- pop_back:删除字符串末尾的字符2.3 字符串匹配与查找- find:查找子字符串在字符串中首次出现的位置- rfind:查找子字符串在字符串中最后一次出现的位置- count:计算子字符串在字符串中出现的次数- index:返回子字符串在字符串中首次出现的位置- last_index:返回子字符串在字符串中最后一次出现的位置2.4 字符串编辑与转换- substring:获取字符串子串- insert:在指定位置插入字符或子字符串- append:向字符串末尾添加字符或子字符串- remove:删除指定位置的字符或子字符串- replace:替换字符串中的子串- truncate:截断字符串2.5 字符串大小写转换- to_lower:将字符串转换为小写- to_upper:将字符串转换为大写2.6 字符串编码和解码- getBytes:获取字符串的字节数组- setBytes:设置字符串的字节数组- codePointAt:获取指定位置的字符编码- codePointBefore:获取指定位置前一个字符的编码3.具体方法详解在此部分,我们将详细介绍上述方法的具体使用和功能。
C++自己实现一个String类

C++⾃⼰实现⼀个String类C++⾃⼰实现⼀个String类(构造函数、拷贝构造函数、析构函数和字符串赋值函数)#include <iostream>#include <cstring>using namespace std;class String{public:// 默认构造函数String(const char *str = nullptr);// 拷贝构造函数String(const String &str);// 析构函数~String();// 字符串赋值函数String& operator=(const String &str);private:char *m_data;int m_size;};// 构造函数String::String(const char *str){if(str == nullptr) // 加分点:对m_data加NULL 判断{m_data = new char[1]; // 得分点:对空字符串⾃动申请存放结束标志'\0'的m_data[0] = '\0';m_size = 0;}else{m_size = strlen(str);m_data = new char[m_size + 1];strcpy(m_data, str);}}// 拷贝构造函数String::String(const String &str) // 得分点:输⼊参数为const型{m_size = str.m_size;m_data = new char[m_size + 1]; //加分点:对m_data加NULL 判断strcpy(m_data, str.m_data);}// 析构函数String::~String(){delete[] m_data;}// 字符串赋值函数String& String::operator=(const String &str) // 得分点:输⼊参数为const{if(this == &str) //得分点:检查⾃赋值return *this;delete[] m_data; //得分点:释放原有的内存资源m_size = strlen(str.m_data);m_data = new char[m_size + 1]; //加分点:对m_data加NULL 判断strcpy(m_data, str.m_data);return *this; //得分点:返回本对象的引⽤}。
定义一个串类CMyString

定义一个串类CMyString/*定义一个串类CMyString,建立适当的构造函数字符串使用指针保存字符串必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到CmyString对象)求字符串中的一个字符或改变字符串中的一个字符(采用重载[]),完成串的赋值与合并(重载+),得到表示字符串的指针地址*/#include#include#includeusing namespace std;class CMyString{public:char *str;int len;public:CMyString( ){str = NULL;len = 0;}CMyString(char *p){str=p;len=strlen(str);}CMyString(CMyString &c);~CMyString(){}int Length();friend void compare(CMyString c1,CMyString c2);void isEmpty();void clear();void Display();/**/friend CMyString operator+(CMyString &c1,CMyString &c2){CMyString s;s.str=new char[strlen(c1.str)+strlen(c2.str)+1];strcpy(s.str,c1.str);strcat(s.str,c2.str);s.len=strlen(s.str);return s;}char & operator[](int n){static char ch=0;if(n>len-1){cout<<"整数下表越界"<<endl;< p="">return ch;}else return *(str+n);}};/**/CMyString::CMyString(CMyString &c) { str=new char[strlen(c.str)+1];strcpy(str,c.str);}int CMyString::Length(){return len;}void CMyString::isEmpty(){if(str!=NULL)cout<<str<<"字符串不为空"<<endl;< p=""> elsecout<<str<<"字符串为空"<<endl;< p="">}void CMyString::clear(){this->str=NULL;this->len=0;}/**/void CMyString::Display (){if(str!=NULL)cout<<str<<endl;< p="">elsecout<<"字符串为空"<<endl;< p="">}void compare(CMyString c1,CMyString c2) {if(strcmp(c1.str,c2.str)>0)cout<<c1.str<<"大于"<<c2.str<<endl;< p=""> if(strcmp(c1.str,c2.str)<0)cout<<c1.str<<"小于"<<c2.str<<endl;< p=""> if(strcmp(c1.str,c2.str)==0)cout<<c1.str<<"等于"<<c2.str<<endl;< p=""> }int main(){system("color 2b");char s1[100],s2[100];bool f=true;int a;CMyString str1(s1),str2(s2);CMyString str3,str4;while(1){if(f){system("color 2b");cout<<" --------------------------------------------"<<endl;< p="">cout<<" |**********[]链表操作**********|"<<endl;< p="">//cout<<" |**********[]输入字符串**********|"<<endl;< p=""> cout<<" |**********[1]输出字符串**********|"<<endl;< p=""> //cout<<" |**********[3]求字符串的长度**********|"<<endl;< p="">cout<<" |**********[2]字符串赋值**********|"<<endl;< p=""> cout<<" |**********[3]比较字符串大小**********|"<<endl;< p="">cout<<" |**********[4]合并字符串**********|"<<endl;< p=""> cout<<" |**********[5]判断字符串是否为空**********|"<<endl;< p="">cout<<" |**********[6]将字符串置空**********|"<<endl;< p=""> cout<<" |**********[7]返回**********|"<<endl;< p="">cout<<" --------------------------------------------"<<endl;< p="">cout<<"输入数字8结束:"<<endl;}< p="">cout<<"请输入操作数:";cin>>a;f=false;if(a==8)break;if(a>0&&a<8){CMyString str1("chian"),str2("american");CMyString str3,str4;switch(a){case 1:{/*cout<<"输入字符串s1:";cin.getline(s1,50);cout<<<"输入字符串s2:";cin.getline(s2,50);cout<<endl;}break;<="" p=""> case 2:{*/CMyString str1("chian"),str2("american");CMyString str3,str4;cout<<"字符串str1为:";str1.Display();cout<<"字符串str2为:";str2.Display();cout<<"字符串str1的长度为:";cout<<str1.length()<<endl;< p="">cout<<"字符串str2的长度为:";cout<<str2.length()<<endl;}break;< p="">case 2:{cout<<"将Str1赋值给str3后输出str3:";str3=str1;str3.Display ();}break;case 3:{cout<<"判断字符串str1与str2的大小:";compare(str1,str2);}break;case 4:{cout<<"将字符串str1与str2合并并输出:"; str4=str1+str2;str4.Display ();}break;case 5:{cout<<"判断字符串str2是否为空:";str2.isEmpty();}break;case 6:{cout<<"将字符串str1置空:";str1.clear();str1.Display ();}break;case 7:break;}}}return 0;}</str2.length()<<endl;}break;<></str1.length()<<endl;<></endl;}<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></c1.str<<"等于"<<c2.str<<endl;<> </c1.str<<"小于"<<c2.str<<endl;<> </c1.str<<"大于"<<c2.str<<endl;<> </endl;<></str<<endl;<></str<<"字符串为空"<<endl;<></str<<"字符串不为空"<<endl;<> </endl;<>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ccnu_hupo_cpp_class_tst6exercise2_by:lele_2013_10_30
new不忘delete
Design the string class in the C++ library by providing your own implementation for the following functions (name your class MyString):
MyString();//构造
MyString(const char* cString);//地址不能变
char at(int index) const;//输入数组下标,返回字符
int length() const;//长度
void clear();//清空len=0
bool empty() const;//是否清空?len不变
int compare(const MyString& s) const;//
int compare(int index, int n, const MyString& s) const;
void copy(char s[], int index, int n);
char* data() const;
int find(char ch) const;
int find(char ch, int index) const;
int find(const MyString& s, int index) const;
*/
#include<iostream>
#include<string.h>
using namespace std;
class MyString
{
public:
MyString();
MyString(const char* cString);
char at(int index) const;//
int length() const;
void clear();
bool empty() const;
int compare(const MyString& s) const;
int compare(int index, int n, const MyString& s) const;
void copy(char s[], int index, int n);
char* data() const;
int find(char ch) const;
int find(char ch, int index) const;
int find(const MyString& s, int index) const;
~MyString()
cout<<"delete..."<<endl;
delete []a;
}
private:
char *a;
int len;
};
MyString::MyString(const char* cString)
{
if (cString==NULL)
{
a=new char[1];
a[0]=0;
int len=0;
}
else
{
a=new char [strlen(cString)+1];
strcpy(a,cString);
len=strlen(cString);
}
}
char MyString::at(int index) const
{
if(len==0)
{cout<<"no char in string"<<endl;
return 0;
}
if(index>len)
{
cout<<"the maximun array exceed"<<endl;
return 0 ;
}
else
{
return a[index-1];
}
}
int MyString::length() const
return len;
}
void MyString::clear()
{
if(!a)
{
delete []a;
a=NULL;
}
len=0;
//a=" ";
}
bool MyString::empty() const
{
if(len==0)
return true;
else
return false;
}
int MyString::compare(const MyString& s) const
{
int m=this->len;int n=s.len;
for(int i=0;i<m&&i<n;i++)
{
if(s.a[i]==a[i])
continue;
else if(s.a[i]<a[i])
return 1;
else
return -1;
}
return 0;
}
int MyString::compare(int index, int n, const MyString& s) const {
int m=len,k=s.len;
if(index+n>m||index+n>k)
{
cout<<"cannot compare!"<<endl;
///I dont know how to solve it
}
for(int i=index-1,j=0;i<n+index;i++,j++)
{
if(s.a[j]==a[i])
continue;
else if(s.a[j]<a[i])
return 1;
else
return -1;
}
return 0;
}
void MyString::copy(char s[], int index, int n) {
if(n>=len)
{cout<<"the maximun array exceed"<<endl;} else if(n+index-1>len)
{
cout<<"the maximun array exceed"<<endl;
return;
}
else
{
for(int i=n-1,j=0;i<n+index-1;i++,j++)
s[j]=a[i];
}
}
char* MyString::data() const
{
return a;
}
int MyString::find(char ch) const
{
for(int i=0;i<len;i++)
{
if(ch==a[i])
return i+1;
}
return 0;
}
int MyString::find(char ch, int index) const
{
if(index>len||index<1)
{
cout<<"the index num is should be 1~ "<<len<<endl;
return 0;
}
for(int i=index-1;i<len;i++)
{
if(ch==a[i])
return i+1;
}
return -1;
}
int MyString::find(const MyString& s, int index) const
{
if(index>s.len||index<1)
{
cout<<"the index num is should be 1~ "<<s.len<<endl;
return 0;
}
char ch=s.a[index-1];
for(int i=0;i<len;i++)
{
if(ch==a[i])
return i+1;
}
return 0;
}。