本文将介绍 的函数有:strcat(),strcmp(),strcpy(),stelen(),strstr(),strerror(),strrev(),strup()和相应的模拟实现,希望会对友友们的技能学习有所帮助.
注: 定义取材于cpluspluc.com
1.函数介绍和使用
1.1函数介绍
1.1.1 strcat()
定义:
char * strcat ( char * destination, const char * source );
功能:在字符串dest后面追加一个字符串src,返回字符串dest的起始地址.
//使用实例 #include <stdio.h> #include <string.h> int main() { char str1[10] = "abc"; char str2[] = "def"; char* str3 = strcat(str1,str2); //得到的结果是 abcdef,我们可以用%s类型打印 return 0; }
注:dest的数组空间一定要足够大能容纳的下src中的数据,否则会造成缓冲区的溢出
1.1.2 strcmp()
定义:
int strcmp ( const char * str1, const char * str2 );
比较规则:对str1和str2中的字符依次比较,在第一个不同的字符处比较出大小后结束,返回一个size_t的数值
比如:abcd和sq比较就是小于
cbd和daa比较就是大于
返回值理解:返回值 > 0 str1大于str2 这里的大于等于小于指的是ASCII码
返回值 = 0 str1等于str2
返回值 < 0 str1小于str2
函数使用:
int main() { char arr1[] = "abcdef"; char arr2[] = "abcqw"; int ret = strcmp(arr1, arr2); printf("%d\n", ret); //返回值为负数 return 0; }
1.1.3 strcpy()
定义:
char * strcpy ( char * destination, const char * source );
功能:将src中的字符串拷贝到dest中,返回dest的地址
函数使用:
int main() { int arr1[20] = { 0 }; int arr2[100] = "slacla"; strcpy(arr1, arr2); return 0; }
1.1.4 strncmp(),strncpy(),strncat()
定义:
int strncmp ( const char * str1, const char * str2, size_t num );
char * strncpy ( char * destination, const char * source, size_t num );
char * strncat ( char * destination, const char * source, size_t num );
功能和前面类似,限制了拷贝/追加,比较的字符个数,相对更安全
注:拷贝不会把'\0'给补上,如果只有三个字符,但是要求拷贝6个字符,就用'\0'补齐
1.1.5 strlen()
定义:
size_t strlen ( const char * str );
功能:计算字符串长度,从起始地址一直找到'\0'为止.
使用:
char arr[10] = "abc"; int num = strlen(arr); //num = 3
1.1.6 strstr()
定义:
const char * strstr ( const char * str1, const char * str2 );
使用:在str1中寻找首次出现的子串str2,返回str1中出现的子串地址
例:str1="abcdef"
str2 = "bc"
返回值以%s形式打印为bcdef
1.1.7 strerror()
定义:
char * strerror ( int errnum );
使用:
使用2.在操作时打印错误信息
例:打开一个莫须有的文件
这里我要介绍另一个函数,fopen
fopen是打开文件函数,返回值是一个FILE*类型的指针
打开失败返回NULL,打开成功,返回文件的地址
这里因为我们没有<test.txt>这样的文件,所以我们无法打开文件,系统将打开失败的原因传给了errno这个全局变量,我们就可以通过打印函数将其打印出来
File* pf = fopen("hello.txt",r); if(pf == NULL) { printf("%s\n",strerror(errno)); }
最终会打印出 No such file or directory 这样的错误信息
1.1.7 strrchr() ,strchr()
strche()
定义:char *strchr(char *str, char c)
功能:查找str中首次出现c的位置,如有有,则返回出现位置,否则返回NULL。
strrchr()
定义:char *strrchr(char *str, char c)
功能:查找str中最后一次出现c的位置,如有有,则返回出现位置,否则返回NULL。
2.部分函数的模拟实现
2.1 strcat()模拟实现
char* my_strcat(char* dest, const char* src) { //用ret指针来记录dest的起始位置 char* ret = dest; assert(dest && src); //1.找到arr1的末尾(\0) while (*dest != '\0') { dest++; } //数据追加 while (*dest++ = *src++); return ret; }
此模拟实现有一定缺陷,比如不能自己追加自己,因为会造成死循环,理由是第一次我找到'\0'的时候我就覆盖掉了'\0',导致不能结束循环.
2.2 strcmp()模拟实现
int my_strcmp(const char* str1, const char* str2) { while (*str1 == *str2) { assert(str1 && str2); if (*str1 == '\0') return 0; str1++; str2++; } if (*str1 > *str2) return 1; else return -1; } //优化 int my_strcmp(const char* str1, const char* str2) { while (*str1 == *str2) { assert(str1 && str2); if (*str1 == '\0') return 0; str1++; str2++; } return *str1 - *str2; }
2.3 strcpy()模拟实现
char *strcpy(char *dest,const char *src) { //assert(dest!=NULL&&src!=NULL); char *ret=dest; while(*dest++=*src++); return ret; }
2.4 strlen()模拟实现
//计数器 size_t my_strlen(const char* str) { int count = 0; while (*str != "\0") { count++; str++; } return count; } //递归 size_t my_strlen(const char* str) { if (*str != "\0") { return 1 + my_strlen(str + 1); } else return 0; } size_t my_strlen(const char* str) { //指针减去指针 const char* start = str; const char* end = str; while (end != "\0") { end++; } return end - start; } size_t my_strlen(const char* str) { const char* end = str; while (end++); return end - str - 1; }
2.5 strstr()模拟实现
const char* my_strstr(const char* str1, const char* str2) { assert(str1 && str2); //cp指针记录我从哪里开始匹配的 //在str1中找str2第一次出现的位置,如果没有就返回空指针 //str1和str2两个指针用来记录字符串的起始位置 //s1和s2负责移动,cp用来记录开始匹配的位置 if (*str2 == '\0') return str1; const char* cp; const char* s1; const char* s2; cp = str1; //判断是不是空字符串 while (*cp) { s1 = cp; s2 = str2; while (*s1 && *s2 && *s1 == *s2) { s1++; s2++; } if (*s2 == '\0') return cp; cp++; } return NULL; }
2.6 strrev()模拟实现
//功能:反转字符串 char *strrev(char *str) { if(str==NULL) return NULL; char *start=str; char *end=str+strlen(str)-1; char temp; while(start<end) { temp=*start; *start=*end; *end=temp; start++; end--; } return str; }
2.7 strrchr() ,strchr()模拟实现
char *my_strchr(char *str, char c) { while(*str!='\0'&&*str!=c) { str++; } return (*str==c? str: NULL); } char *my_strrchr(char *str, char c) { char *p=str+strlen(str);//p指向最后一个字符 while(p!=str&&*p!=c) p--; if(p==str&&*p!=c) return NULL; else return p; }