本文主要用C语言实现了字符串处理中的如下几个函数功能。
1)Mystrlen实现的是求字符串的长度
2)Mystrcpy实现字符串的复制
3)Mystrcat实现连接两个字符串
4)Mystrcmp实现比较两个字符串大小
5)convert实现小写字符到大写字符的转换
实现的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// Get the length of string
int Mystrlen(const char* src)
{
const char* p = src;
assert(src != NULL);
while(*(p++) != '\0');
return p - src - 1;
}
// Copy the source string to destination string
void Mystrcpy(char* dest, const char* src)
{
int i = 0;
assert(dest != NULL && src != NULL);
if(dest && src)
{
while((*(dest + i) = *(src + i)) != '\0')
i++;
*(dest + i) = '\0';
}
// return dest;
}
// concatenate the two string.
void Mystrcat(char *dest, const char *src)
{
assert(dest != NULL && src != NULL);
while(*(dest++) != '\0');
dest--;
while((*dest++ = *src++) != '\0');
}
// compare the two string
int Mystrcmp(const char *str1, const char *str2)
{
assert(str1 != NULL && str2 != NULL);
while(*str1 != '\0' && *str2 != '\0')
{
if(*str1 > *str2)
return 1;
else if(*str1 == *str2)
{
*str1++;
*str2++;
}
else
{
return -1;
}
}
if(*str1 != '\0')
return 1;
else if (*str2 != '\0')
return -1;
else
return 0;
}
// Convert the Low case to Upper case
void convert(char *str)
{
while(*str != '\0')
{
if(*str >= 'a' && *str <= 'z')
{
*str = *str + 'A' - 'a';
}
str++;
}
}
int main()
{
int i = 0;
char dest[20] = "hello,";
char *s = "world!";
char d[7];
int length;
length = Mystrlen(s);
printf("%d\n", length);
Mystrcpy(d, s);
puts(s);
convert(d);
puts(d);
Mystrcat(dest, s);
puts(dest);
if(Mystrcmp(dest, s) == 1)
{
printf("dest great than s");
}
else if(Mystrcmp(dest, s) == -1)
{
printf("dest less than s");
}
else
{
printf("dest equal to s");
}
system("pause");
return 0;
}
其中strlen还有如下的实现:
利用递归来实现计算字符串的长度,但是当字符串太长的时候,递归实现计算字符串的长度会出现如下的问题
1.开销太大,因为函数调用的开销比循环大很多。
2.递归的效率低,当深度太大时,可能会出现错误(如栈溢出)
代码如下:
方法1:
int my_strlen(const char* str)
{
assert(NULL != str);
if('\0' == *str)
{
return 0;
}
else
{
return (1 + my_strlen(++str));
}
}
方法2:
int my_strlen(const char* str)
{
assert(NULL != str);
return ('\0' != *str) ? (1 + my_strlen(++str)) : 0;
}