str系列源码小结
1、strcmp
①、原形:int strcmp(const char * str1, const char * str2)
②、功能:比较两个字符串的大小
③、代码
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1,const char* str2);
int main()
{
int ret = 0;
char* str1 = "hellx";
char* str2 = "hellw";
ret = my_strcmp(str1,str2);
if(ret > 0)
{
printf("%s > %s\n",str1,str2);
}
else if(ret < 0)
{
printf("%s < %s\n",str1,str2);
}
else
{
printf("equal!\n");
}
return 0;
}
int my_strcmp(const char* str1,const char* str2)
{
assert(str1 != NULL && str2 != NULL);
while(*str1 == *str2)
{
str1++;
str2++;
}
return(*str1 - *str2);
}
2、strncmp
①、原形:int strncmp(const char * str1, const char * str2, int count)
②、功能:比较两个字符串中前count个字节的大小
③、代码
//比较两个字符串中前count个字节的大小
#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* str1,const char* str2, int count);
int main()
{
int ret = 0;
int count = 5;
char* str1 = "hellx";
char* str2 = "hellw";
ret = my_strncmp(str1,str2,count);
if(ret > 0)
{
printf("前%d字符中:%s > %s\n",count,str1,str2);
}
else if(ret < 0)
{
printf("前%d字符中:%s < %s\n",count,str1,str2);
}
else
{
printf("equal!\n");
}
return 0;
}
int my_strncmp(const char* str1,const char* str2, int count)
{
assert(str1 != NULL && str2 != NULL);
if(!count)
{
return 0;
}
while((--count) && ((*str1++) == (*str2++)));
return(*str1 - *str2);
}
3、strcpy
①、原形:void strcpy(char * destin, const char * source)
②、功能:把source指向的字符串拷贝到destin指向的字符串中
③、代码
//将source字符串拷贝到dest
#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest,char* source);
int main()
{
char str1[] = {0};
char* str2 = "helloworld!";
my_strcpy(str1,str2);
puts(str1);
return 0;
}
void my_strcpy(char* dest,char* source)
{
assert(dest != NULL && source != NULL); //断言
while((*dest++ = *source++));
}
4、strncpy
①、原形:void strncpy(char * destin, const char * source,int count)
②、功能:把source指向的字符串中前count个字符拷贝到destin指向的字符串中
③、代码
/将source中的count个字符复制到dest中
#include<stdio.h>
#include<assert.h>
void my_strncmp(char* dest,char* source,int count);
int main()
{
char str1[] = {0};
char *str2 = "hello world";
int count = 13;
my_strncmp(str1,str2,count);
puts(str1);
return 0;
}
void my_strncmp(char* dest,char* source,int count)
{
assert((dest != NULL) && (source != NULL));
while((count--) && (*dest++ = *source++));
}
5、strcat
①、原形:void strcat(char* dest, const char *source)
②、功能:将source中的字符串拼接到dest中
③、代码:
//拼接字符串
#include<stdio.h>
#include<assert.h>
void my_strcat(char* dest,const char* source);
int main()
{
char str1[] = "hello";
char* str2 = "world!";
char* s = " ";
my_strcat(str1,s);
my_strcat(str1,str2);
puts(str1);
return 0;
}
void my_strcat(char* dest,const char* source)
{
assert(dest != NULL && source != NULL);
while(*dest)
{
dest++;
}
while((*dest++ = *source++));
}
6、strlen
①、原形:unsigned int strlen(const char * str)
②、功能:计算字符串长度
③、代码
#include<stdio.h>
#include<assert.h>
unsigned int my_strlen(const char* str);
int main()
{
unsigned int len = 0;
char* str = "helloworld!";
len = my_strlen(str);
printf("字符串%s的长度为:%u \n",str,len);
return 0;
}
unsigned int my_strlen(const char* str)
{
unsigned int len = 0;
while(*str != '\0')
{
len++;
str++;
}
return len;
}
7 、strchr
①、原形:char * strchr(char * str, const char ch)
②、功能:返回字符ch第一次出现的位置
③、代码:
//返回字符第一次出现的位置
#include<stdio.h>
#include<assert.h>
char* my_strchr(char* str,const char c);
int main()
{
char* str = "hello";
char c = 'l';
char *p = NULL;
p = my_strchr(str,c);
if(!p)
{
printf("Not find!\n");
}
else
{
printf("in %s,%c located:%p \n",str,c,p);
}
return 0;
}
char* my_strchr( char* str,const char c)
{
assert(str != NULL);
char* temp = str;
while(*temp && (*temp != c))
{
temp++;
}
return ((*temp == c) ? temp : NULL);
}
8、strrchr
①、原形:char * strrchr(char * str, const char ch)
②、功能:返回字符ch最后一次出现的位置
③、代码
#include<stdio.h>
#include<assert.h>
char* my_strrchr(char* str,const char c);
int main()
{
char* str = "hello";
char c = 'l';
char *p = NULL;
p = my_strrchr(str,c);
if(!p)
{
printf("Not find!\n");
}
else
{
printf("in %s,%c located:%p \n",str,c,p);
}
return 0;
}
char* my_strrchr( char* str,const char c)
{
assert(str != NULL);
char* temp = str;
while(*temp)
{
temp++;
}
while((temp != str) && (*temp != c))
{
temp--;
}
return ((*temp == c) ? temp : NULL);
}
9、strdup
①、原形:char * strdup(const char * str)
②、功能:拷贝字符串到新申请的内存
③、代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* my_strdup(const char* str);
int main()
{
char* str = "helloworld";
char* temp = my_strdup(str);
puts(temp);
free(temp);
return 0;
}
char* my_strdup(const char* str)
{
char* temp = malloc(sizeof(char) * (strlen(str) + 1));
assert(str != NULL && temp != NULL);
strcpy(temp,str);
return temp;
}
10、strrev
①、原形:void strrev(char * str);
②、功能:翻转字符串
③、代码
//翻转字符串
#include<stdio.h>
#include<assert.h>
void my_strrev(char* str);
int main()
{
char str[] = "hello";
my_strrev(str);
puts(str);
return 0;
}
void my_strrev(char* str)
{
char* end = str;
while(*end++);
end--; //与end++抵消
end--; //跳过'\0'
while(str < end)
{
char temp;
temp = *str;
*str++ = *end;
*end-- = temp;
}
}
推荐阅读
-
str系列源码小结
-
Java 集合系列(四)—— ListIterator 源码分析
-
spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
-
Java并发系列之Semaphore源码分析
-
Java并发系列之CyclicBarrier源码分析
-
Java并发系列之ConcurrentHashMap源码分析
-
Java并发系列之CountDownLatch源码分析
-
Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)
-
spring-boot-2.0.3不一样系列之源码篇 - run方法(三)之createApplicationContext,绝对有值得你看的地方
-
死磕 java同步系列之Phaser源码解析