说明
字符串操作函数在C语言中的使用是相当多的,也难怪标准库函数有定义实现,也是一个很明智的选择,帮助我们简化了对字符串的操作。
其实我们也可以尝试写一下这些常用函数的具体实现方法,也可以帮助我们对这些函数有更深的理解,之后使用时也会更加自如。
查看函数的使用手册
要实现一个函数,当然先需要知道它的作用是什么,相信大多数人都会摆渡,基本也都能解决问题。Linux环境下,其实我们可以用man命令查看函数的使用说明,有很详细的讲解,包括函数的声明、使用描述、返回值等,只不过是英文的,但是可以尝试查看,相信以后会有帮助。
具体的使用我就不写了,直接写实现代码,不一定十分严密,也应该不是最简洁高效的,但基本没大问题,经供参考。
注意:
1、函数开头的输入错误的判断我写的不严密,不要照着使用。我觉得有些可以打印提示后,直接用assert退出。
2、个人觉得大多数都是不难的,最难的可能就是strtok函数了,一定要先理解它的使用方法。
字符串操作函数
1、strlen
#define ERR_INPUT -2
int strlen(const char *str)
{
if(!str)
{
printf("INPUT ERROR!\n");
return ERR_INPUT;
}
int len = 0;
while(str[len] != '\0')
{
len++;
}
return len;
}
2、strcat
char *strcat(char *dest, const char *src)
{
if(!dest || !src)
{
printf("INPUT ERROR!\n");
return NULL;
}
int len = strlen(dest);
int i = 0;
while(src[i] != '\0')
{
dest[len + i] = src[i];
i++;
}
dest[len + i] = '\0';
return dest;
}
3、strcmp
int strcmp(const char *str1, const char *str2)
{
if(!str1 || !str2)
{
printf("INPUT ERROR!\n");
return -2;
}
int len = strlen(str1);
int len2 = strlen(str2);
if(len2 < len)
len = len2;
int i = 0;
int check = 0;
for(i = 0; i <= len; i++)
{
if(str1[i] > str2[i])
{
check = 1;
break;
}
else if(str1[i] < str2[i])
{
check = -1;
break;
}
}
return check;
}
4、strncmp
int strncmp(const char *str1, const char *str2, int n)
{
if(!str1 || !str2 || n < 1)
{
printf("INPUT ERROR!\n");
return -2;
}
int i = 0;
int check = 0;
for(i = 0; i < n; i++)
{
if(str1[i] > str2[i])
{
check = 1;
break;
}
else if(str1[i] < str2[2])
{
check = -1;
break;
}
}
return check;
}
5、strcasecmp
int strcasecmp(const char *str1, const char *str2)
{
if(!str1 || !str2)
{
printf("INPUT ERROR!\n");
return -2;
}
char p1, p2;
int len = strlen(str1);
int len2 = strlen(str2);
if(len2 < len)
len = len2;
int i = 0;
int check = 0;
for(i = 0; i <= len; i++)
{
p1 = str1[i];
p2 = str2[i];
if(str1[i] >= 'A' && str1[i] <= 'Z')
p1 = str1[i] + 32;
if(str2[i] >= 'A' && str2[i] <= 'Z')
p2 = str2[i] + 32;
if(p1 > p2)
{
check = 1;
break;
}
else if(p1 < p2)
{
check = -1;
break;
}
}
return check;
}
6、strchr
char *strchr(const char *str, int n)
{
if(!str || n < 0 || n > 127)
{
printf("INPUT ERROR!\n");
return NULL;
}
char *p = NULL;
int i = 0;
while(str[i] != '\0')
{
if(str[i] == n)
{
p = (char *)str + i;
break;
}
i++;
}
return p;
}
7、strtok
char *strtok(char *str, const char *s)
{
if(!str || !s)
{
printf("INPUT ERROR!\n");
return NULL;
}
static char *last = NULL;
static int p = 0;
static int a[100] = {0};
if(str == NULL && last == NULL)
return ;
if(last != NULL)
{
p++;
last = last + a[p] - a[p - 1];
return (last + 1);
}
int lenstr = strlen(str);
int lens = strlen(s);
int m = 0;
int n = 0;
int i = 0;
for(m = 0; m < lenstr; m++)
{
for(n = 0; n < lens; n++)
{
if(str[m] == s[n])
{
str[m] = '\0';
a[i] = m;
i++;
m++;
break;
}
}
}
last = str;
return last;
}
8、strcpy
char *strcpy(char *dest, const char *src)
{
if(!dest || !src)
{
printf("INPUT ERROR!\n");
return NULL;
}
int i = 0;
while(src[i] != '\0')
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
9、strncpy
char *strncpy(char *dest, const char *src, int n)
{
if(!dest || !src || n < 1)
{
printf("INPUT ERROR!\n");
return NULL;
}
int i = 0;
while(src[i] != '\0' && i < n)
{
dest[i] = src[i];
i++;
}
while(i < n)
{
dest[i] = '\0';
i++;
}
return dest;
}
10、strstr
char *strstr(const char *haystack, const char *needle)
{
if(!haystack || !needle)
{
printf("INPUT ERROR!\n");
return NULL;
}
int len1 = strlen(haystack);
int len2 = strlen(needle);
int len = len1 - len2 + 1;
int i = 0;
int t = 0;
char *p = NULL;
int flag = 1;
for(i = 0; i < len; i++)
{
flag = 1;
for(t = i; t < len2 + i; t++)
{
if(haystack[t] != needle[t - i])
{
flag = 0;
break;
}
}
if(flag)
{
p = (char *)haystack + i;
break;
}
}
return p;
}