栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言、字符串(Visual C++6.0)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言、字符串(Visual C++6.0)

本程序编写了一个字符串并实现了字符串的一些基本操作(字符串建立、获取串长度、子串查找、两串比较大小、字符串连接等等)。

本程序字符串使用结构体类型创建,使用malloc()函数实现数组扩容。


#include
#include
#define MAXLEN 100	//定义常量最大长度

//定义字符串结构体
struct String{
	char *str;
	int length;
};

//函数声明
void CreatStr(String *);
int StrLength(String *);
void printString(String *);
String *Substring(String *,int ,int );
String *StrDelete(String *,int ,int );
String *StrInsert(String *,String *,int ,int );
void processStrInsert(String *);
void processStrDelete(String *);
int StrIndex(String *, String *);
void processStrIndex(String *);
int StrCompare(String *, String *);
void processStrCompare();
void StrCat(String *);
void StrReplace(String *);
void replaceSubstring(String *,String *,String *,int);
void menu();

//建立新串函数
void CreatStr(String *string){	//动态分配内存空间,解决数组空间固定问题
	string->str = (char *)malloc(MAXLEN);
	gets(string->str);
	string->length = StrLength(string);
}

//返回串长函数
int StrLength(String *string){
	int i = 0;
	while(string->str[i] != '') i++;

	return i;
}

//输入输出串及串长
void printString(String *string){
	printf("输入字符串:n");
	CreatStr(string);

	printf("n字符串为:n");
	puts(string->str);
	printf("该字符串串长为:%dn",string->length);
}

//返回子串函数
String *Substring(String *string,int index,int length){
	if(index<1 || index>string->length || length<1 || length>string->length-index+1)
		return NULL;	//判断获取的子串的下标及长度是否符合

	
	String *substring = (String *)malloc(sizeof(String));	//动态分配一个String大小的空间
	substring->str = (char *)malloc(length + 5);	//对数组动态分配一个length+5大小的空间
	int i;
	
	for(i = 0; i < length; i++)	//依次将原串指定下标到长度的值赋给子串
		substring->str[i] = string->str[index+i-1];
	substring->str[i] = '';	//子串加上字符串结束符,防止出现错误
	substring->length = length;	//子串长度赋值

	return substring;
}

//处理子串函数
void processSubstring(String *string){
	String *substring;
	int index,length;

	printf("输入子串的下标及长度:");
	scanf("%d%d",&index,&length);
	substring = Substring(string,index,length);

	if(substring == NULL)
		printf("求子串失败,子串范围应为1~%dn",string->length);
	else{
		printf("子串获取成功,子串为:n");
		puts(substring->str);
	}
	getchar();	//吸收换行符,防止运行时自动跳过下文
}

//删除子串
String *StrDelete(String *string,int index,int length){
	if(index<1 || index > string->length || index+length-1>string->length)
		return NULL;

	String *substring = (String *)malloc(sizeof(String));
	substring->str = (char *)malloc(length + 5);
	int i,j;

	for(i = 0; i < length; i++)	//获取将要删除的子串
		substring->str[i] = string->str[index+i-1];
	substring->str[i] = '';
	substring->length = length;

	for(i = index+length-1,j = index-1; ilength; i++,j++)
		string->str[j] = string->str[i];	//删除子串
	string->length -= length;
	string->str[string->length] = '';

	return substring;	//返回子串
}

//处理子串删除函数
void processStrDelete(String *string){
	int index,length;

	printf("输出要删除的子串的下标及长度: ");
	scanf("%d%d",&index,&length);

	String *substring = StrDelete(string,index,length);

	if(substring == NULL)
		printf("删除子串失败n");
	else{
		printf("删除子串成功,原串为:n");
		puts(string->str);
		
		printf("n删除的子串为:n");
		puts(substring->str);
	}
	getchar();	//吸收换行符
}

//子串插入
String *StrInsert(String *string,String *substring,int index,int length){
	int i;

	if(index<1 || index>string->length+1)
		return NULL;

	for(i = string->length-1; i>=index-1; i--)	//原串| 串长-1~下标-1 |依次后移
		string->str[i+substring->length] = string->str[i];

	for(i = 0; ilength; i++)	//插入子串
		string->str[i+index-1] = substring->str[i];
	string->length += substring->length;
	string->str[string->length] = '';

	return string;
}

//处理子串插入函数
void processStrInsert(String *string){
	String *substring = (String *)malloc(sizeof(String));
	int index;

	printf("输入要插入的子串:n");
	CreatStr(substring);	//substring的数组空间在创建串函数中已被分配

	printf("输入要插入的字符串下标:");
	scanf("%d",&index);

	substring = StrInsert(string,substring,index,substring->length);

	if(substring == NULL)
		printf("子串插入失败,插入范围应为1~%dn",string->length+1);
	else{
		printf("插入子串成功,新的串为:n");
		puts(string->str);
	}
	getchar();	//吸收换行符
}

//返回子串第一次出现的第一个字符的下标
int StrIndex(String *string, String *substring){
	int i,j;
	i = j = 0;

	while(ilength && jlength)
		if(string->str[i] == substring->str[j]){
			i++;	//如果原串中有子串,变量i、j自加
			j++;
		}else{	//否则i从自己的下个字符开始判断,j重新置0
			i = i - j + 1;	
			j = 0;
		}

	if(j >= substring->length)	//j大于或等于子串长度说明原串中有子串
		return i - substring->length +1;
	else
		return -1;
}

//处理子串查找函数
void processStrIndex(String *string){
	String *substring = (String *)malloc(sizeof(String));
	int flag;

	printf("输出要查找的子串:n");
	CreatStr(substring);

	flag = StrIndex(string,substring);
	if(flag == -1)
		printf("查无此串n");
	else
		printf("查找子串成功,子串下标为:%dn",flag);
}

//字符串比较
int StrCompare(String *string1, String *string2){
	int i,j;
	i = j = 0;

	while(ilength && jlength){
		if(string1->str[i] != string2->str[j])
			break;	//如果两串中有字符不相同,立即终止循环

		i++;
		j++;
	}
	
	//如果j等于串长度且两串长度相同,两串相等
	if(j==string2->length && string1->length==string2->length)
		return 0;
	else
		return string1->str[i] - string2->str[j];
}

//处理字符串比较函数
void processStrCompare(){
	String *string1 = (String *)malloc(sizeof(String));
	String *string2 = (String *)malloc(sizeof(String));
	int flag;

	printf("输入第一个字符串:n");
	CreatStr(string1);

	printf("输入第二个字符串:n");
	CreatStr(string2);

	flag = StrCompare(string1,string2);
	if(flag == 0)
		printf("n%s 与 %s 相等n",string1->str,string2->str);
	else if(flag > 0)
		printf("n%s 大于 %sn",string1->str,string2->str);
	else
		printf("n%s 小于 %sn",string1->str,string2->str);
	getchar();	//吸收换行符
}

//字符串连接
void StrCat(String *frontString){
	String *rearString = (String *)malloc(sizeof(String));
	int i;

	printf("输入字符串:n");
	CreatStr(rearString);

	//如果两串长度相加后大于最大长度(MAXLEN),数组扩容
	if(frontString->length + rearString->length >= MAXLEN){
		char *s = frontString->str;	//把原串数组的引用赋给字符指针s
		frontString->str = (char *)malloc(MAXLEN + (int)(MAXLEN * 1.5));
						//原串数组分配最大长度1.5倍的空间

		for(i = 0; i < frontString->length; i++)
			frontString->str[i] = s[i];	//将原串的数据赋给新数组空间
		frontString->str[i] = '';

		free(s);	//释放原数组空间
	}

	for(i = 0; i < rearString->length; i++)	//进行两串连接操作
		frontString->str[i+frontString->length] = rearString->str[i];

	frontString->length += rearString->length;
	frontString->str[frontString->length] = '';

	printf("新字符串为:n");
	puts(frontString->str);
	getchar();	//吸收换行符
}

//处理子串替换函数
void StrReplace(String *string){
	String *sourceSubtring = (String *)malloc(sizeof(String));
	String *targetSubstring = (String *)malloc(sizeof(String));
	int tag;

	printf("输入要替换的原子串:n");
	CreatStr(sourceSubtring);

	printf("输入目标串:n");
	CreatStr(targetSubstring);

	tag = StrIndex(string,sourceSubtring);
	if(tag == -1)	//判断是否有输入的子串
		printf("无原子串n");
	else{	//否则,调用子串替换函数
		replaceSubstring(string,sourceSubtring,targetSubstring,tag);

		printf("子串替换成功,新串为:n");
		puts(string->str);
	}
	getchar();
}

//子串替换
void replaceSubstring(String *string,String *source,String *target,int tag){
	if(tag == -1)	//如果不存在要替换的子串,结束递归
		return;
	else{
		StrDelete(string,tag,source->length);	//执行原子串删除操作
		StrInsert(string,target,tag,target->length);//执行新子串插入操作
		tag = StrIndex(string,source);	//查找字符串中的下一个原子串
		replaceSubstring(string,source,target,tag);	//递归调用本函数
	}
}

//显示菜单
void menu(){
	printf("n                   串子系统");
	printf("n==============================================");
	printf("n|           1--建立新串并显示该串及长度      |");
	printf("n|           2--求子串                        |");
	printf("n|           3--删除子串                      |");
	printf("n|           4--插入子串                      |");
	printf("n|           5--查找子串                      |");
	printf("n|           6--比较两个串大小                |");
	printf("n|           7--连接两个串                    |");
	printf("n|           8--子串替换                      |");
	printf("n|           0--返回                          |");
	printf("n==============================================");
	printf("n请输入菜单号(0-8):");
}

void main(){
	String x;
	String *string;
	char ch1,ch2 = 'y';
	string = &x;

	do{
		menu();
		scanf("%c",&ch1);
		getchar();
	
		switch(ch1){
		case '1':printString(string);break;
		case '2':processSubstring(string);break;
		case '3':processStrDelete(string);break;
		case '4':processStrInsert(string);break;
		case '5':processStrIndex(string);break;
		case '6':processStrCompare();break;
		case '7':StrCat(string);break;
		case '8':StrReplace(string);break;
		case '0': ch2 = 'n';break;
		}

		if(ch1 != '0'){
			printf("按回车键继续,按任意键退出");
			ch1 = getchar();
			if(ch1 != 'n'){
				getchar();
				ch2 = 'n';
			}
		}
	}while(ch2=='y' || ch2=='Y');
	
	printf("n本次操作结束,");
	system("pause");//输出运行时程序末尾的中文翻译
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429734.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号