简单实现C语言中关于字符串的库函数

实现函数strlen
	#include<stdio.h>
	
	int Strlen(char *s){
		int count=0;
		while(*s!='\0'){
			count++;
			s++;
		}
		return count;
	}
	
	int main(){
		char *s,S[50];
		int len;
		printf("请输入一串字符:\n");
		gets(S);
		s=S;
		len=Strlen(s);
		printf("该字符串的长度为:%d\n",len);
		return 0;
	}
实现函数atoi
	#include<stdio.h>
	#include<ctype.h>
	#include<stdlib.h>
	
	int Atoi(char arr[]){
	
		int index = 0;//记录数组下标
	    int num = 0;  //存放最终要返回的值
	    int flag = 1; //设置符号标志位
	
		if(arr == NULL)
	    {
	        //非法输入
	        return -1;
	    }   
	        
	    while(isspace(arr[index]))//是空格返回非零值(不一定是1),否则返回0
	    {
	        index++;//跳过空格字符,不只有空格,还有\n,\r,\f,\t,\v之类的字符
	    }   
	    if(arr[index] == '-')
	    {
	        flag = -1; //除空格外遇到的第一个数字是符号,标记为-1
	    }   
	    //注意:正负号不算作1
	    if(arr[index] == '-' || arr[index] == '+')//如果遇到正负号,说明可以往后继续走
	    {
	        index++;
	    }
	    while(arr[index] >= '0' && arr[index] <= '9')//如果遇到的数字说明可以继续往下走
	    {
	        num = num*10 + arr[index] - '0';
	        index++;
	    }
	    return flag*num;
	}
	
	int main(){
		int n;
		char s[] = "-456er12";
		n=atoi(s);
		printf("该字符串转换为整数后为(调用库函数):%d\n",n);
		n=Atoi(s);
		printf("该字符串转换为整数后为(自己实现的库函数):%d\n",n);
		return 0;
	}
实现函数itoa
	#include<stdio.h>
	#include<stdlib.h>
	#include<assert.h>
	
	void invert(char *p, int N) //N为字符串长度
	{
	    assert(p != NULL);
	   
	    if (N == 1|| N == 0)   //当N是奇数时,N=1返回;当N是偶数时,N=0返回
	    {
	        return;
	    }
	    else
	    {
	        char ch = p[0];    //下面三条语句进行首尾字符交换
	        p[0] = p[N-1];
	        p[N-1] = ch;
	        invert(p+1, N-2);  //指针后移一位,字符串长度减2
	    }
	}
	
	void Itoa(int num,char *s){
		int index,m,flag,length;
		index=m=flag=length=0;
		if(num<0){
			num=-num;
			flag=-1;
		}
		do{
			m=num%10;          //m为num的最后一位
			num=num/10;        //num变为排除掉它自己最后一位后的数
			s[index++]=m+'0';  //将最后一位变为字符后加入字符串中
			length++;          //记录字符串长度
		}while(num);           //商为0时结束循环
		if(flag==-1){
			s[index++]='-';
			length++;
		}
		s[index]='\0';
		invert(s,length);
	}
	
	void main(){
		int num;
		char *s;
		s=(char*)malloc(50*sizeof(char));
		num=+12356789;
		printf("将%d变成字符串输出后为:",num);
		Itoa(num,s);
		puts(s);
	}
实现函数strcat
	#include<stdio.h>
	#include<stdlib.h>
	
	char* Strcat(char *s1,char *s2){ //将s2连接到s1后
		int i,j;
		char *s;
		if(s1==NULL||s2==NULL)
			return NULL;
		i=j=0;
		s=s1;
		while(s1[i])
			i++;
		while(s2[j])
			s1[i++]=s2[j++];
		s1[i]='\0';
		return s;
	}
	
	int main(){
		char s1[10]="123"; //这里用字符数组更好
		char s2[]="456";
		printf("s1=%s,s2=%s\n",s1,s2);
		Strcat(s1,s2);
		printf("将s2连接到s1后为:\n");
		printf("s1=%s\n",s1);
	}
实现函数strncat
	#include<stdio.h>
	#include<stdlib.h>
	
	char* Strncat(char *s1,char *s2,int n){ //将s2连接到s1后
		int i,j;
		char *s;
		if(s1==NULL||s2==NULL)
			return NULL;
		i=j=0;
		s=s1;
		while(s1[i])
			i++;
		while(s2[j]&&j<n)
			s1[i++]=s2[j++];
		s1[i]='\0';
		return s;
	}
	
	int main(){
		char s1[10]="123"; //这里用字符数组更好
		char s2[]="4567";
		printf("s1=%s,s2=%s\n",s1,s2);
		Strncat(s1,s2,2);
		printf("将s2的前2个字符连接到s1后为:\n");
		printf("s1=%s\n",s1);
	}
实现函数strcpy
	#include<stdio.h>
	
	char* Strncpy(char *s1,char *s2){
		int i=0;
		char *s;
	
		if(s1==NULL||s2==NULL)
			return NULL;
	
		s=s1;
		while(s2[i])
			s1[i]=s2[i++];
		s1[i]='\0';
		
		return s;
	}
	
	void main(){
		char s1[10]="";
		char s2[]="1234";
		printf("s2中元素为:%s\n",s2);
		Strncpy(s1,s2);
		printf("将s2赋值给s1后:s1=%s\n",s1);
	}
实现函数strncpy
	#include<stdio.h>
	
	char* Strncpy(char *s1,char *s2,int n){
		int i=0;
		char *s;
	
		if(s1==NULL||s2==NULL)
			return NULL;
	
		s=s1;
		while(i<n)
			s1[i]=s2[i++];
		s1[i]='\0';
		
		return s;
	}
	
	void main(){
		char s1[10]="";
		char s2[]="1234";
		printf("s2中元素为:%s\n",s2);
		Strncpy(s1,s2,3);
		printf("将s2的前三个元素赋值给s1后:s1=%s\n",s1);
	}
实现函数strcmp
	#include<stdio.h>
	
	int Strcmp(char *s,char *c){
		int i=0;
		while(s[i]&&c[i]){  //同时遍历二者
			if(s[i]>c[i])
				return 1;
			else if(s[i]<c[i])
				return -1;
			else
				i++;
		}
		if(s[i])            //谁没遍历完谁大,都遍历完了一样大
			return 1;
		else if(c[i])
			return -1;
		else
			return 0;
	}
	
	void main(){
		//char *s="123",*c="1234";
		char s[10],c[10];
		printf("请输入第一个字符串\n");
		gets(s);
		printf("请输入第二个字符串\n");
		gets(c);
		if(Strcmp(s,c)==1)
			printf("%s大于%s\n",s,c);
		else if(Strcmp(s,c)==-1)
			printf("%s小于%s\n",s,c);
		else
			printf("%s等于%s\n",s,c);
	}
实现函数strncmp
	#include<stdio.h>
	
	int Strncmp(char *s,char *c,int n){
		int i=0;
		while(i<n&&s[i]&&c[i]){   //同时遍历二者
			if(s[i]>c[i])
				return 1;
			else if(s[i]<c[i])
				return -1;
			else
				i++;
		}
		if(s[i]=='\0'||c[i]=='\0') //n至少长于二者中的一个
			return -2;
		else 
			return 0;
	}
	
	void main(){
		int n;
		char s[10],c[10];
		printf("请输入第一个字符串\n");
		gets(s);
		printf("请输入第二个字符串\n");
		gets(c);
		printf("请输入要比较的字符个数\n");
		scanf("%d",&n);
		if(Strncmp(s,c,n)==1)
			printf("%s的前%d个字符大于%s\n",s,n,c);
		else if(Strncmp(s,c,n)==-1)
			printf("%s的前%d个字符小于%s\n",s,n,c);
		else if(Strncmp(s,c,n)==0)
			printf("%s的前%d个字符等于%s\n",s,n,c);
		else 
			printf("字符串过短,不能比较\n");
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言常用的字符串库函数有很多,以下是其几个常见的: 1. strlen:用于计算字符串的长度,即不包括终止符'\0'的字符个数。 2. strcpy:用于将源字符串复制到目标字符串,包括终止符'\0'。 3. strncpy:与strcpy类似,但可以指定复制的最大长度,避免内存溢出。 4. strcat:用于将源字符串连接到目标字符串的末尾,包括终止符'\0'。 5. strncat:与strcat类似,但可以指定连接的最大长度,避免内存溢出。 6. strcmp:用于比较两个字符串的大小,返回值为0表示相等,小于0表示第一个字符串小于第二个字符串,大于0表示第一个字符串大于第二个字符串。 7. strncmp:与strcmp类似,但可以指定比较的最大长度。 8. strchr:用于在字符串查找某个字符的首次出现位置,并返回该位置的指针。 9. strrchr:与strchr类似,但查找的是字符在字符串最后一次出现的位置。 10. strstr:用于在字符串查找某个子串的首次出现位置,并返回该位置的指针。 11. strtok:用于将字符串按照指定的分隔符进行分割,并返回分割后的子串。 这些函数可以在C语言的string.h头文件找到对应的函数声明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言常用字符串库函数总结](https://blog.csdn.net/weixin_44098461/article/details/115472138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C语言字符与字符串库函数](https://blog.csdn.net/qq_61213622/article/details/125884482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值