IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++串的堆,顺序创建 -> 正文阅读

[C++知识库]C/C++串的堆,顺序创建

程序设计的思想以及应该避免的错误都在代码中旁的注释中有标明,此程序适用于串的顺序(即普通的数组形式的创建)和堆创建,此外,此代码并不难,只是运用简单的数组的思想,希望对你有所帮助,最好,看明白后,自己别看,然后打出来,如果是照抄,希望最少抄两遍

//非常抱歉,由于程序在设计之初是本着开辟一个随机位置的数组进行编程的,但是在检验时发现此程序最大也就只能记录到127个字符,
//所以在程序中str类型的数组应该第一个都啥都没存,后期加了一个int型的数来存储,程序改了好几遍,不过不影响整体思维设计部分
//应该..应该这个版本是CSDN里堆顺序串最全的,但是依然有些许的小bug,但但....不出意外,你找不到我的bug,这个bug不影响程序运行
//但是对于空间有些许的浪费,时间不多,累了,有时间再来改 
#include<iostream>//我发现个bug,捏码,数组怎么销毁,你能删除一个int型的数吗,这不是扯淡嘛,所以..我写的是主题是堆,但emmm.思想一样 
#include<string.h>
#include<stdlib.h>
using namespace std;
#define MAX 255
typedef struct Str
{
	//另外请注意,因为第一位存储的并不是字符而是字符串的长度,所以后边的很多地方需要向后一位!!!请注意 
	char *ch;
	int len;//踏马的,忘了char也就只能存127这么大,擦擦擦擦擦擦,这牛马我不待改完,尼玛 
	//上边和下边其实没有什么区别,但利于销毁 
	//char ch[MAX+1];//若是用第一个位值的元素存储此串的长度,那么是肯定不必重新定义一个len的 
	//int len;
}Str; 
void menu(void);
void caidancaozuo(Str& str);
void StrAssign(Str& str);//初始化一个串,并且在一个串中加入一串连续的值就是让用户随便的输入一串字符
void StrEmpty(Str str);//判断是否为空,是否存在,最简单了 
void StrCopy(Str& str);//复制一个串 
void Strcat(Str& str);//在第一个串后加入一个串 
void Index(Str str);//检索到你想要查的某一个字符在此字符串中出现的地方,检索一串的emmm...下一个再写 
void insert(Str& str);//插入一个字符 
void Replace(Str& str);//替换一个字符 
void Clear(Str& str);//清空字符串 
void Destroy(Str& str);//销毁字符串 
void OutPut(Str str);//输出整个字符串 
void OutPutIndex(Str str);//输出你要从哪一个位置开始的后面的所有的字符串 
void OutLen(Str str);//输出字符串的长度 非常之easy 


int main(void)
{
	Str str;
    menu();
    caidancaozuo(str);
} 
void menu(void)       
{                      //我觉得我这个菜单写的不赖很经典,写前边了,哈哈哈哈哈
	char a01[] = "(1)创建顺序串";
	char a02[] = "(2)判断是否为空以及判断否存在";
	char a03[] = "(3) 复制一个串";
	char a04[] = "(4)第一个串后加入一个串(即追加,不过会这个,插入一段一定会) ";
	char a05[] = "(5)查找某个字符在串中的位置";
	char a06[] = "(6)插入一个字符";
	char a07[] = "(7)替换一个字符";
	char a08[] = "(8)清空字符串";
	char a09[] = "(9)销毁字符串";
	char a10[] = "(10)输出整个字符串";
	char a11[] = "(11)输出你要从哪一个位置开始的后面的所有的字符串";
	char a12[] = "(12)串的长度";
	char a13[] = "输入入任意不在前面菜单的数字将结束程序";
 
	printf("%-50s", a01);
	printf("%-50s\n", a02);
	printf("%-50s", a03);
	printf("%-50s\n", a04);
	printf("%-50s", a05);
	printf("%-50s\n", a06);
	printf("%-50s", a07);
	printf("%-50s\n", a08);
	printf("%-50s", a09);
	printf("%-50s\n", a10);
	printf("%-50s", a11);
	printf("%-50s\n", a12);
	printf("%-50s\n", a13);
}
void caidancaozuo(Str& str)//再次自我感觉良好觉得这个自我调用也不赖,放前边了 
{
	cout << "请问你想选择哪个指令" << endl;
	int mingling;
	cin >> mingling;
	switch (mingling)
	{
	case 1:
	{
		StrAssign(str);
		caidancaozuo(str);
		break;
	}
	case 2:
	{
		StrEmpty(str);
		caidancaozuo(str);
		break;
	}
	case 3:
	{
		StrCopy(str);
		caidancaozuo(str);
		break;
	}
	case 4:
	{
		Strcat(str);
		caidancaozuo(str);
		break;
	}
	case 5:
	{
		Index(str);
		caidancaozuo(str);
		break;
	}
	case 6:
	{
		insert(str);
		caidancaozuo(str);
		break;
	}
	case 7:
	{
		Replace(str);
		caidancaozuo(str);
		break;
	}
	case 8:
	{
		Clear(str);
		caidancaozuo(str);
		break;
	}
	case 9:
	{
		Destroy(str);
		caidancaozuo(str);
		break;
	}
	case 10:
	{
		OutPut(str);
		caidancaozuo(str);
		break;
	}
	case 11:
		OutPutIndex(str); 
		caidancaozuo(str);
		break;
	case 12:
		OutLen(str);
		caidancaozuo(str);
		break;
	default:
		cout << "您已经决定退出此程序,程序即将退出" << endl;
		break;
	}
}
void StrAssign(Str& str)
{
	//内个啥 内个你输入空格就退出了嗷,空格后边的不算 
	str.ch=(char*)malloc(sizeof(char)*(MAX+1));
	str.len=0;//经实验得出结果s的值或许需设的特别大 
	cout<<"请输入一串字符(范围是1到254)"<<endl;//因为最后一位是要存储\0的 ,第一位是存储长度的,所以你懂的 
	char s[100000];
	scanf("%s",s);
	int i=1;
	//cout<<str.ch[0]<<endl;
	while(s[i-1]&&str.len<=(MAX-1))
	{
		str.ch[i]=s[i-1];
		i++;
		str.len+=1; 
		if(i==MAX)
		{
			cout<<"您输入的字符数已经超过了规定的最大的数值"<<endl; 
			break ;
			
		}
	}
    str.ch[i]='\0';//我想给他在最后手动加一个\0 
    //经实验得出结果这个效果比较不错,哈哈哈哈哈哈 
	OutPut(str);
}
void StrEmpty(Str str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0){
		cout<<"您的串是空的"<<endl; 
		return ;
	}else{
	//请注意下边的写法是错误的,请思考原因 但是强转一下还是可以滴 
	//	cout<<"您的串不为空,它的长度是"<<str.ch[0]<<endl;
	printf("您的串不为空,它的长度是%d\n",str.len);
	return ;
	}
}
void StrCopy(Str& str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0)//这个情况根据本程序的设计很难出现 
	{
		cout<<"你的串长是0怎么给你复制啊"<<endl;
		return ;
	}else{
		cout<<str.len<<endl;
		//printf("您的串不为空,它的长度是%d\n",str.ch[0]);
	}
	cout<<"您要复制的串是:"<<endl;
	OutPut(str);
	Str strfuben;
	strfuben.ch=(char*)malloc(sizeof(char)*(MAX+1));
	strfuben.len=0;
	int i=1;
	while(str.ch[i])//思考一下吧 
	{
		strfuben.ch[i]=str.ch[i];
		i++;
		strfuben.len=1; 
	}
    strfuben.ch[i]='\0';//我想给他在最后手动加一个\0
    cout<<"复制后输出的结果是:"<<endl;
	OutPut(strfuben);
}
//这个函数有点意思哈 
void Strcat(Str& str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	/* 
	此程序为在一个串后追加一个数组,我觉得就很简单啥的,但是哈,
	结合插入函数和这个,其实稍微改一点你就可以实现在任意的位置插入啥的,非常的简单哈,自己去想*/
	cout<<"请输入你要追加的串是什么"<<endl;
	//其实这样也很没意思,那我直接在后面继续输入不得了,就是不新创建一个串了(but这个想法很低级,只是为了完成作业而已) 
	//为什么要创建还是有原因的,为啥?...自己想,而且这两种并无区别 
	if(str.len==(MAX-1))
	 	{
	 		cout<<"你这还加个der啊,第一个都超出范围了"<<endl;
	 		return; 
		 }
	Str appstr;
	StrAssign(appstr);
	int x=str.len+appstr.len;
	if(x<MAX-1)
	{
		cout<<"可以追加"<<endl;
	    int a=appstr.len;
	    int b=str.len;
	    int i=1;
	    while(appstr.ch[i]) 
	    {
	      str.ch[0]+=1;
		  str.ch[b+1]=appstr.ch[i];
		  b++;
		  i++;
    	}
    	str.ch[b+1]='\0';//这个有点意思,请仔细思考b、i啥的实际的增减啥的 
	 }else{
	 	cout<<"由于您的这个创建的串的总长度没有这么多,所以,只能追加一部分嗷"<<endl;
	 	
	    int a=appstr.len;
	    int b=str.len;
	    int i=1;
	    while(appstr.ch[i]) 
	    {
	      str.ch[0]+=1;
		  str.ch[b+1]=appstr.ch[i];
		  if(str.len==(MAX-1))
		  {
		  	cout<<"追加的部分结束"<<endl;
			break; 
		  }
		  b++;
		  i++;
    	}
    	str.ch[MAX]='\0';//这个有点意思,请仔细思考b、i啥的实际的增减啥的 
	 }
	 cout<<"追加后的串中的字符是:"<<endl; 
	OutPut(str);
}
void Index(Str str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0){
		cout<<"您的串是空的"<<endl; 
		return ;
	}
	cout<<"请输入你想查询你要查询的字符是什么"<<endl;
	char a;
	cin>>a;
	int b=0;//记录出现的次数 
	for(int i=1;str.ch[i]!='\0';i++)
	{
		if(str.ch[i]==a)
		{
			cout<<"您输入的"<<a<<"在此串中的第"<<i<<"个位置有出现"<<endl;
			b++; 
		}
	}
	if(b==0)
	{
		cout<<"您的字符并未在串中出现"<<endl;
	}else{
		cout<<"你的字符在串中共出现了"<<b<<"次"<<endl;
	}
}
//插入一个如此,插入一段字符串思想则是相同的,在for循环体中 
void insert(Str& str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0){
		cout<<"您的串是空的"<<endl; 
		return ;
	}
	cout<<"请输入你要在第几个元素后插入元素:";
	int x;
	cin>>x;
	cout<<"请输入你要插入的字符是什么:";
	char a;
	cin>>a;
	str.len++;//一是插入后本身肯定会加一,二是有个\0需要你注意 
	int q=str.len;
	for(int i=q;i>x;i--)
	{
		str.ch[i+1]=str.ch[i];
	}
	str.ch[x+1]=a; 
	OutPut(str);
}
void Replace(Str& str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0){
		cout<<"您的串是空的"<<endl; 
		return ;
	}
	cout<<"请输入你想在把第几个位置的字符给替换"<<endl;
	int x;
	cin>>x;
	cout<<"请输入你想在把第"<<x<<"个位置的字符给替换为什么"<<endl;
	char a;
	cin>>a;
	str.ch[x]=a;
}
void Clear(Str& str)
{if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0){
		cout<<"您的串本身就是空的哈"<<endl; 
		return ;
	}
	cout<<"即将开始执行清除命令"<<endl;
	str.len=0;
	str.ch[1]='\0';//笑死,捏嘛,清除个der啊
	cout<<"清除成功"<<endl; 
}
void Destroy(Str& str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	cout<<"即将执行销毁命令"<<endl;
	str.len=0;

	free(str.ch);
	//cout<<str.ch[2]<<endl;利用此方式进行销毁 
	str.ch=NULL;
	
	cout<<"销毁命令已被执行"<<endl; 
}
void OutPut(Str str)
{
	if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0){
		cout<<"您的串是空的"<<endl; 
		return ;
	}
	int i=1;
	//因为我在他的后边主动加了\0,哈哈哈哈哈哈 
	cout<<"您的串的字符是:"; 
	while(str.ch[i])
	{
		cout<<str.ch[i];
		i++;
	}
	cout<<endl;
}
void OutPutIndex(Str str)
{ 
   if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
	}
	if(str.len==0){
		cout<<"您的串是空的"<<endl; 
		return ;
	}
	cout<<"请问你要从第几个字符开始输出"<<endl;
	int x;
	cin>>x;
	int a=str.len;//!!! 
	if(x<0||x>a) 
	{
		cout<<"请输入在1至"<<a<<"个数字范围内的数字"<<endl; 
		return ;
	}else{
		int i=x;
		//请自己好好分析下i和x的赋值原因 
		while(str.ch[i])
		{
			cout<<str.ch[i];
			i++;
		}
		cout<<endl;	
	}
}
void OutLen(Str str)
{	
    if(str.ch==NULL)
    {
    	cout<<"您未创建一个串,请先创建一个串"<<endl; 
    	return; 
    	
	}
     //记住不可使用下边的这种输出方式,看一下正确的写法,自己想想
	 //另外此种版本的写法,可以说几乎完全不符合逻辑,写一写锻炼下逻辑就够了 
	//cout<<"您的串中共有"<<str.ch[0]<<"个字符"<<endl; 
	cout<<"您的字符串中共有"<<str.len<<"个字符"<<endl;	 
}







  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:18:07  更:2021-10-23 12:19:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:58:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码