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语言)

要求实现串的基本操作:

  1. 串的创建
  2. 输出串长
  3. 进行两个串的比较(如果是包含关系则比较串长,否则比较ASCALL码的值)
  4. 清空串
  5. 两个串的连接
  6. 求出某个串指定位置的子串
  7. 求出子串在指定串的位置

主要参考教科书上的伪代码进行修改了

但是运行过程中却有一些问题,让人无法理解

HString T1,T2,T3,Sub;			//宏定义变量 

就是这个基本定义,原本我是在main函数里面定义的,但是总是运行之后出现了错误终止。

实现的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct {
	char* ch;
	int length;
}HString;

int StrAssign(HString& T, char* chars) {   //创建串
	char* c;
	int i;
	if (T.ch)
		free(T.ch);
	for (c = chars, i = 0; *c; ++c, ++i)
		if (!i) {
			T.ch = NULL;
			T.length = 0;
			c--;
		}
		else {
			if (!(T.ch = (char*)malloc(i * sizeof(char))))
				return 1;
			for (int j = 0; j < i; j++)
				T.ch[j] = chars[j];
			T.length = i;
		}
	return 0;
}

int StrLength(HString T) {					//返回串长
	return T.length;
}

int StrCompare(HString S, HString T) {					//串之间的比较
	for (int i = 0; i < S.length && i < T.length; i++)
		if (S.ch[i] != T.ch[i])return S.ch[i] - T.ch[i];
	return S.length - T.length;
}

int StrClear(HString& T) {					//清空串
	if (T.ch) {
		free(T.ch);
		T.ch = NULL;
	}
	T.length = 0;
	return 0;
}

int StrConcat(HString& T, HString S1, HString S2) {					//串连接
	if (T.ch)
		free(T.ch);
	if (!(T.ch = (char*)malloc((S1.length + S2.length) * sizeof(char))))
		return 1;
	T.length = S1.length + S2.length;
	for (int i = 0; i < S1.length; i++)
		T.ch[i] = S1.ch[i];
	for (int i = 0; i < S2.length; i++)
		T.ch[i + S1.length] = S2.ch[i];
	return 0;
}

int SubString(HString& Sub, HString S, int pos, int len) {				//获取子串
	if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)
		return 1;
	if (Sub.ch)
		free(Sub.ch);
	if (!len) {
		Sub.ch = NULL;
		Sub.length = 0;
	}
	else {
		Sub.ch = (char*)malloc(len * sizeof(char));
		for (int i = pos - 1, j = 0; j < len ;  j++)
			Sub.ch[j] = S.ch[i++];
		Sub.length = len;
	}
	return 0;
}

int StrSelect(HString Sub, HString S) {								//查找子串位置 
	if (Sub.ch && S.ch && Sub.length > 0 && S.length > 0)
		for (int i = 0; i < S.length; i++) {
			HString s;
			int temp;
			if (S.ch[i] == Sub.ch[0])
			{
				SubString(s, S, i + 1, Sub.length);
				temp = StrCompare(s, Sub);
				if (temp == 0)
					return i + 1;
			}
		}
	return -1;
}

HString T1,T2,T3,Sub;			//定义全局变量 

int main() {
	char chars[11],charss[11];
	
	int sign,n=1;
	do {
		printf("****************功能表*********************\n");
		printf("**  1.创建串    2.输出串长   3.串的比较  **\n");
		printf("**  4.清空串    5.连接串     6.求子串    **\n");
		printf("**  7.子串位置               8.退出      **\n");
		printf("*******************************************\n");
		printf("请选择功能键进行操作:\n");
		scanf("%d", &sign);
		switch (sign)
		{
		case 1:
			int temp;
			printf("请选择创建串类型:\n(1.创建T1   2.创建T2   3.创建T1,T2)\n");
			scanf("%d",&temp);
			switch(temp){
				case 1:
					printf("请输入串T1:\n");
					scanf("%s", chars);
					StrAssign(T1,chars);
					break;
				case 2:
					printf("请输入串T2:\n");
					scanf("%s", charss);
					StrAssign(T2, charss);
					break;
				case 3:
					printf("请输入两个字符串:\n");
					scanf("%s", chars);
					StrAssign(T1,chars);
					scanf("%s", charss);
					StrAssign(T2, charss);
					break;	
			}
			break;
		case 2:
			printf("创建第一个字符串的长度:\n");
			printf("%d\n", StrLength(T1));
			printf("创建第二个字符串的长度:\n");
			printf("%d\n", StrLength(T2));
			break;
		case 3:
			if (StrCompare(T1, T2) == 0)
				printf("两串相等\n");
			else if (StrCompare(T1, T2) > 0)
				printf("第一个串更大\n");
			else if (StrCompare(T1, T2) < 0)
				printf("第二个串更大\n");
			break;
		case 4:
			StrClear(T1);
			printf("串已清空\n");
			printf("第一个串的长度变为%d\n", StrLength(T1));
			break;
		case 5:
			StrConcat(T3,T1, T2);
			printf("新串为%s\n", T3.ch);
			break;
		case 6:
			SubString(Sub, T1, 3, 3);
			printf("子串为\n%s\n", Sub.ch);
			break;
		case 7:
			if(StrSelect(Sub,T2)==-1) 
				printf("子串不存在于T2中!\n");
			else
				printf("T1的子串在T2的位置:\n%d\n",StrSelect(Sub,T2));
			break;
		case 8:
			n=0;
			break;
		default:
			break;
		}
	} while (n==1);
		return 0;
}

其运行结果如下

串

但是一但改变定义的位置,从局部变量变成全局变量就会导致运行结果改变串

有能够解释的朋友还请不吝赐教,在下万分感激!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:31:50  更:2021-12-01 17:33:54 
 
开发: 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 9:06:50-

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