c语言string类函数及自实现

字符串日常tip/problem



一、字符串函数

10.29遇到了strcmp的平替

他喵的这个题让我自己写代码执行strcmp的功能
先淡定的复习一下strcmp

1.strcmp的使用
int strcmp(const char * s1,const char * s2);

根据ASCII码比较字符串

如果s1字符串在机器排序序列中位于s2字符串的后面,该函数返回一个正数;如果两个字符串相等,则返回0;如果s1字符串在机器排序序列中位于s2的前面,该函数返回一个负数。

对这段我比较蒙啊,机器排序序列??什么东西鸭。然后我决定自己写个代码探索一下。

#include<stdio.h>
#include<string.h>
int main()
{
	char s1[127],s2[127];
	int i;
	scanf("%s %s",s1,s2);
	i=strcmp(s1,s2);
	printf("%d",i);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
比较的就是两者ASCII码值的大小。在这里插入图片描述
前>后,则返回一个正数,一般就是1啦;前=后,返回0;前<后,返回负数,一般就是-1;

2.自己编写程序实现strcmp

题目:
由键盘输入两个长度不超过100的字符串,比较其是否相同,若相同则输出YES,否则输出NO。
(说明:相同意味着长度相同并且同一位上的字符相同。不能使用任何字符串处理函数)
输入输出说明:
输入:ABC ABC
输出:YES

#include<stdio.h>
bool strcmp(char *s1,char *s2)
{
	int n1,n2,i;
	for(i=0;s1[i]!=0;i++)/*统计第一个字符串的长度*/
	n1=i;
	for(i=0;s2[i]!=0;i++)/*统计第二个字符串的长度*/
	n2=i;
	if(n1!=n2)
	return false;
	for(int i=0;i<101;i++)
	{
		if(s1[i]!=s2[i])
		return false;	
	}
	return true;
}
int main()
{
	char s1[101]={'\0'},s2[101]={'\0'};
	scanf("%s %s",s1,s2);
	if(strcmp(s1,s2))
	printf("YES");
	else
	printf("NO");
}

王总的代码贼高级!

#include<stdio.h>
int main()
{
	int i;
	char s1[101]={'\0'},s2[101]={'\0'};
	scanf("%s %s",s1,s2);
	for(i=0;i<101;i++)
	{
		if(s1[i]!=s2[i])
		{
			printf("NO");
			return 0;
		}
		if(s1[i]=='\0'&&s2[i]=='\0')//同时结尾表示长度相同
		{
			printf("YES");
			return 0;
		}
	}
	return 0;
}

根据函数原型。标准的平替应该如下;

#include<stdio.h>
#include<assert.h>
int mystrcmp(const char *s1,const char *s2)
{
	assert(s1!=NULL && s2!=NULL);
	while(*s1&&*s2&&(*s1==*s2))
	{
		s1++;
		s2++;
	}
	return *s1-*s2;
}
int main()
{
	char s1[101]={'\0'},s2[101]={'\0'};
	scanf("%s%s",s1,s2);
	int i=mystrcmp(s1,s2);
	if(i>0)
	printf("no,s1大");
	else if(i<0)
	printf("no,s2大");
	else
	printf("yes");
	return 0; 
 } 

10.30遇到了strchr

1.strchr的使用
char * strchr(consit char * s,char c);

如果s字符串中包含c字符,该函数返回指向s字符串首位置的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);如果在字符串s中未找到c字符,该函数返回空指针。

11.1遇到了strcat的平替

1.strcat的使用
char*strcat(char* restrict s1,const char * restrict s2)

strcat()(用于拼接字符串)函数接收两个字符串作为参数。该函数把第二个字符串的备份附加在第一个字符串末尾,并把拼接后的新字符串作为第一个字符串,第二个字符串不变。strcat()函数的类型是char*(即,指向char的指针),strcat()函数返回第一个参数,即拼接第二个字符串后的第一个字符串的地址s2字符串的第一个字符将覆盖s1字符串末尾的空字符。
就这么用!
在这里插入图片描述

2.自实现strcat字符串处理函数
#include<stdio.h>
char * replace(char *s1,char*s2)
{
	char * temp=s1;
	while(*temp)
		temp++;//找到s1的末尾
	while(*temp++=*s2++);
	return s1;
}
int main()
{
	char s1[127],s2[127];
	scanf("%s %s",s1,s2);
	printf("%s",replace(s1,s2));
}
#include<stdio.h>
char *mystrcat(char *s1,char *s2)
{
	assert(NULL != s1 && NULL != s2);//如果条件不满足,则终止程序
	char *temp=s1;
	while(*temp!='\0')
	temp++;//while循环出来temp指向原字符串的NULL空字符的位置
	while(*s2!='\0')
	*temp++=*s2++;
	return s1; 
}
int main()
{
	char s1[127],s2[127];
	scanf("%s%s",s1,s2);
	printf("%s",mystrcat(s1,s2));
 } 

11.20遇到了strlen的平替(并非偶遇事件

1.strlen的使用

函数原型

size_t strlen( const char *string );

功能:计算字符串长度,不包含’\0’
返回值:返回字符串的字符数

2.自实现strlen字符串处理函数
#include<stdio.h>
int mystrlen(const char *s)
{
	if(s==NULL)
	return 0;
	int len=0;
	while(*s)
	{
		len++;
		s++;
	}
	return len;
}
int main()
{
	char s[]={'\0'};
	scanf("%s",s);
	printf("%d",mystrlen(s));
	return 0;
}

11.20遇到了strcpy(并非偶遇事件

1.strcpy的使用

函数原型

char* strcpy(char* dest,char* src)

功 能: 将参数src字符串拷贝至参数dest所指的地址
返回值: 返回参数dest的字符串起始地址

2.自实现strcpy字符串处理函数
#include<stdio.h>
char * mystrcpy(char *dest,const char*src) 
{
	if(dest==NULL ||src==NULL)
	return NULL;
	char *ptr=dest;//保存字符串初始地址
	while(*src)
	{
		*ptr++=*src++;
	 } 
	*ptr='\0';//末尾添加结束符 
	return dest;
}
int main()
{
	char s1[]={'\0'};
	char s2[101]={'\0'};//s2必须定义大小。因为s2是被读的那个。
	scanf("%s%s",s1,s2);
	mystrcpy(s1,s2);
	printf("%s",s1);
	return 0;
}
2.自实现strcnpy字符串处理函数

1)将以字符串src所指向的地址开始的前n个字节复制到dest中,并返回dest

2)如果src的前n个字符不含NULL结束符,则dest不会以NULL字符结束

3)如果n>strlen(src)+1,则以’\0’填充dest,直到复制完n个字节

4)src和dest所指内存区域不可以重叠且dest必须有足够的空间(sizeof(dest)>=strlen(src)+1)来容纳src的字符串

5)dest和n应该满足:sizeof(dest)>=n

#include<stdio.h>
#include<assert.h>
char *strncpy(char *dest,char *src,unsigned int n)
{
	assert(NULL!=dest && NULL!=src);
	char *temp=dest;
	while(n>0&&*src!='\0')
	{
		*temp++=*src++;
		--n;
	}
	if(n>0)
	{
		*temp='\0';
	}
	return dest;
}
int main()
{
	char s1[127],s2[127];
	scanf("%s%s",s1,s2);
	printf("%s",strncpy(s1,s2,6));
}

9-7 使用函数实现字符串部分复制 (20分)

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

#include<string.h>
void strmcpy( char *t, int m, char *s )
{ 
    
    int i,j,cnt=strlen(t);
    if(m>cnt)
     *s=NULL;
    for(i=m-1,j=0;i<cnt;i++,j++)
    {
        s[j]=t[i];
    }
    s[j]='\0';//在字符串最后加上\0表示字符串结束
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值