字符函数和字符串函数
C语言对字符和字符串的处理还是很频繁的。字符串可以存放在字符串常量中,也可以存放在字符数组中。我们应该掌握有关字符函数和字符串函数的使用。
下边介绍一些常用的字符串的库函数及使用
-
求字符串长度 strlen
-
长度不受限制的字符串函数 strcpy strcat strcmp
-
字符串查找 strstr
-
内存操作函数 memcpy memmove
strlen
size_t strlen(const char* str);
该函数用来求字符串长度,返回的是 ‘\0’前面出现字符的个数。用该函数计算字符串长度时,函数指向的字符串必须以’\0’结束。
strlen函数实现:
int strlen(const char* str)
{
assert(str != NULL);
int ret = 0;
while (*str)
{
ret += 1;
str++;
}
return ret;
}
strcpy
char* strcpy(char* dst, const char* src);
该函数将src指向的字符串拷贝到dst指向的数组中,包括源字符串中的’\0’。
strcpy函数实现
char* my_strcpy(char* dst, const char* src)
{
assert(dst != NULL);
assert(src != NULL);
char* ret = dst;
while(*dst++=*src++)
{
;
}
return ret;
}
strcat
char *strcat(char* dst, const char* src);
把源字符串追加拷贝在目的字符串后,目的字符串结尾的’\0’将被src指向字符串第一个字符覆盖。
strcat函数实现
char * strcat(char* dst, const char* src)
{
char *ret = dst;
assert(dst != NULL);
assert(src != NULL);
//找到目的字符串中'\0'的位置
while (*dst)
{
dst++;
}
//将源字符串的数据进行拷贝
while (*dst++ = *src++)
{
;
}
return ret;
}
strcmp
int strcmp(const char* dst, const char* src)
规定:如果第一个字符串大于第二个字符串,返回值大于0;
如果第一个字符串等于第二个字符串,返回值等于0;
如果第一个字符串小于第二个字符串,返回值小于0;
strcmp函数实现
int strcmp(const char* dst, const char* src)
{
assert(dst != NULL);
assert(src != NULL);
int ret = 0;
while (*dst && *src)
{
ret = *dst - *src;
if (ret > 0)
{
return 1;
}
else if (ret < 0)
{
return -1;
}
else
{
dst++;
src++;
}
}
if (*src)
{
return -1;
}
else if (*dst)
{
return 1;
}
else
{
return 0;
}
}
strstr
char * strstr(const char *str1,const char* str2)
返回str2在str1中第一次出现的指针,如果没有,返回空指针。
strstr函数实现
char * strstr(const char *str1,const char* str2)
{
assert(str1!= NULL);
assert(str2!= NULL);
while (*str1 != '\0')
{
if (*str1 != *str2)
{
str1++;
}
else
{
const char *str1_start = str1++;
const char *str2_start = str2++;
while ((*str1 == *str2) && (*str2 != '\0'))
{
str1++;
str2++;
}
if (*str2 == '\0')
{
return (char *)str1_start;
}
else
{
str1 = str1_start+1;
str2 =str2_start ;
}
}
}
return NULL;
}
memcpy
void *memcpy(void* dst, const void* src, size_t num)
函数memcpy从src位置开始向后的num个字节复制到dst的内存位置,源内存块和目标内存块重叠时,复制结果是未定义的。
memcpy函数实现
void *memcpy(void* dst, const void* src, size_t num)
{
void* ret = dst;
assert(dst != NULL);
assert(src != NULL);
while (num--)
{
*(char* )dst = *(char*)src;
((char*)dst)++;
((char*)src)++;
}
return ret;
}
memmove
void *memmove(void* dst, void *src, size_t num)
该函数与memcpy的区别就是,源内存块和目标内存块可以重叠。
memmove函数实现:
void *memmove(void* dst, void *src, size_t num)
{
void *ret = dst;
assert(dst != NULL);
assert(src != NULL);
//正拷贝
if ((dst < src) || ((char *)dst >= (char *)src + num))
{
while (num--)
{
*(char*)dst = *(char*)src;
((char*)dst)++;
((char*)src)++;
}
}
//倒拷贝
else
{
char *dst_end = (char *)dst + num - 1;
char *src_end = (char *)src + num - 1;
while (num--)
{
*(char*)dst_end = *(char*)src_end;
((char*)dst_end)--;
((char*)src_end)--;
}
}
return ret;
}