字符串常见操作,你想要的这里都有

整理了一下近一年以来学习的有关字符串操作的函数,一方面是为了督促自己养成勤于整理碎片知识的习惯,一方面是通过再一次的敲击与思考加深自己对这些代码的思考。

#include<stdio.h>
#include<string.h>

#define N 80

//求串长 
int myStrLen(char *str)
{
	int i;//既是扫描下标,又是计数器 
	
	for(i=0;*(str+i)!='\0';i++) 
		;//空操作 
	return i;
} 
//串比较 
int myStrCmp(char *s,char *t)
{
	while(*s && *t && *s==*t)
	{
		s++;
		t++; 
	} 
	//跳出while条件有二:1.*s或*t至少有一为空【到达'\0'】、2.*s!=*t 
	//通过第一个条件运算符判断条件1
	//通过第2个条件运算符判断条件2 
	return (*s==*t)?0:(*s>*t?1:-1);
} 
//串逆序输出 
void myStrReverse()
{
	char str[N];
	int i;
	printf("input a string:\n");
	gets(str);
	printf("after reverse:\n");
	//下标i指向字符串末尾,从后往前打印 
	for(i=strlen(str)-1;i>=0;i--)
		printf("%c",str[i]);
	printf("\n");
}
//删除串中指定字符 
void myStrDel()
{
	//申请一个临时字符数组strtemp,用于存储非指定字符 
	char str[N],strtemp[N];
	int i,j;
	printf("enter a string :");
	gets(str);
	
	for(i=0,j=0;i<strlen(str);i++)
		if(str[i]!='c')
			strtemp[j++]=str[i]; 
	strtemp[j]='\0';//由于是字符串,末尾记得补'\0' 
	
	strcpy(str,strtemp);
	printf("after  delete,str=%s",str);
} 
 //字符串复制 
void myStrCopy()
{
	char s1[N],s2[N]="ascdefg\0hijk";
	int i=0;
	while(1)
	{
		//先赋值,再判断是否为结束标志。 
		s1[i]=s2[i]; 
		if(s2[i]=='\0')
			break;
	
		i++;
	}
	printf("after string copy :%s\n",s2);
 } 
 //串连接 
 void myStrCat()
 {
 	char dstStr[20]="12345",srcStr[20]="6789";
 	int i,j;
 	
 	printf("before strcat:\n");
 	printf("dststr=%s,srcstr=%s\n",dstStr,srcStr);
 	printf("\n");
 	
 	for(i=0;dstStr[i]!='\0';i++)
	 	;//空操作,找到dstStr中'\0'的位置
	
	//将srcStr的字符逐一置于dstStr后面 
 	for(j=0;srcStr[j]!='\0';j++)
 		dstStr[i+j]=srcStr[j];
 		
 	dstStr[i+j]='\0';//新串末尾加'\0' 
 	
 	printf("after strcat:\n");
 	printf("dstStr=%s\n",dstStr);
} 
//串连接 
void myStrCat1(char dstStr[],char srcStr[])//亦可将形参换为指针变量 
{
	int i,j=0;
	while(dstStr[i]!='\0')//计算串长 
		i++;
	while(srcStr[j]!='\0')
	{
		dstStr[i]=srcStr[j];
		i++;
		j++;
		
	}
	dstStr[i]='\0';
}
//模式串匹配 【简单模式匹配】 
int myStrLoc(char str1[],char str2[])
{
	unsigned int i,len1,len2;
	//分别计算主串和模式串的长度 
	len1=strlen(str1);
	len2=strlen(str2);
	//当主串的长度小于模式串时,铁定无法匹配成功 
	if(len1>len2)
		return -1;
	//循环判断语句:之所以要i<=strlen(str2)-strlen(str1) 
	//是因为当i超出这个范围时,主串的剩余长度小于模式串,此时肯定不匹配 
	for(i=0;i<=strlen(str2)-strlen(str1);i++)
		if(strncmp(str1,str2+i,len1)==0)
			return i;
	return -1;
}
//截取子串 
char *mySubStr(char *s,int start,int len)
{
	static char sstr[20];
	int i;
	if(start<0||start>=strlen(s)||len<0)
		return NULL;
	//注意:当从起始位置开始不足len个字符或中途遇到\0时的情况	
	for(i=0;i<len&&s[start]!='\0';i++)
		sstr[i]=s[start+i];
	sstr[i]='\0';
	return sstr;
}
//字符串循环左移n位【右移同理】 
void myStrShiftL(char *s,int n)
{
	int i,len;
	char ch;
	
	len=strlen(s);
	//左移几位就循环几次,一次移一位 
	for(i=0;i<n;i++)
	{
		ch=s[0];
		strncpy(s,s+1,len-1);
		s[len-1]=ch;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值