上次说了一些比较简单的关于字符串的函数,今天说几个有点意思的关于字符串的函数。
1. strncpy
- 头文件:
#include<string.h>
- 功能:复制字符串
src
中的内容(字符,数字、汉字….)到字符串dest
中,复制多少由size_t n
的值决定。如果src
的前n
个字符不含NULL
字符,则结果不会以NULL
字符结束。如果n<src
的长度,只是将src
的前n
个字符复制到dest
的前n
个字符,不自动添加'\0'
,也就是结果dest
不包括'\0'
,需要再手动添加一个'\0'
。如果src
的长度小于n
个字节,则以NULL
填充dest
直到复制完n
个字节。src
和dest
所指内存区域不可以重叠且dest
必须有足够的空间来容纳src
的字符长度加上'\0'
。
char * my_strncpy(char * dest, const char * source, size_t count)
{
char *start = dest;
while (count && (*dest++ = *source++))
count--;
if (count)
while (--count)
*dest++ = '\0';
return(start);
}
src
串长度<=
dest
串长度,(这里的串长度包含串尾NULL
字符) 如果n>src
由于长度达到src
的 NULL
,正常复制,特别注意,如果src
中有NULL
,strncpy
复制到NULL
即使没到n
也提前停止。如果n =src
串长度,与strcpy
一致。注意n的选择当n > dest
串长度,dest
栈空间溢出产生崩溃异常。
src
串长度>
dest
串长度 如果n=dest
串长度,则dest
串没有NULL
字符,会导致输出会有乱码。如果不考虑src
串复制完整性,可以将dest
最后一字符置为NULL
。
- 使用
strncpy
时,建议将n
置为dest
串长度(除非你将多个src
串都复制到dest
数组,并且从dest
尾部反向操作),复制完毕后,为保险起见,将dest
串最后一字符置NULL
,避免发生前面那种情况下的输出乱码问题。当然喽,无论是strcpy
还是strncpy
,保证dest
串容量(能容纳下src
串)才是最重要的。
- 当然了,还有
momcpy
和mommove
字符串复制函数,已经在我的前一个博客中介绍,其中mommove
更加好用。
2. strncat
- 头文件:
#include <string.h>
- 功能:把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖
dest
所指字符串结尾的'\0'
,从而实现字符串的连接。
- 说明:
src
和dest
所指内存区域不可以重叠,并且dest
必须有足够的空间来容纳src
的字符串。
- 返回值:返回指向
dest
的指针。
char * my_strncat(char * dest, const char * src, size_t count)
{
char *start = dest;
while (*dest++)
;
dest--;
while (count--)
if (!(*dest++ = *src++))
return(start);
*dest = '\0';
return(start);
}
strncat
比strcat
的好处就在于它可以指定要连接的个数。其他的到没有什么可说的。还有strncat
需要手动在字符串最后赋值。
3. strncmp
- 功能:这个函数用来比较
s1
和s2
字符串的前count
个字符。若str1
与str2
的前n个字符相同,则返回0
;若s1
大于s2
,则返回大于0的值;若s1
若小于s2
,则返回小于0
的值。
- 函数
strncmp
与strcmp
极为类似。不同之处是,strncmp
函数是指定比较count
个字符。也就是说,如果字符串s1
与s2
的前count
个字符相同,函数返回值为0
。
int my_strncmp(const char *first, const char *last, size_t count)
{
size_t x = 0;
if (!count)
{
return 0;
}
if (count >= 4)
{
for (; x < count - 4; x += 4)
{
first += 4;
last += 4;
if (*(first - 4) == 0 || *(first - 4) != *(last - 4))
{
return(*(unsigned char *)(first - 4) - *(unsigned char *)(last - 4));
}
if (*(first - 3) == 0 || *(first - 3) != *(last - 3))
{
return(*(unsigned char *)(first - 3) - *(unsigned char *)(last - 3));
}
if (*(first - 2) == 0 || *(first - 2) != *(last - 2))
{
return(*(unsigned char *)(first - 2) - *(unsigned char *)(last - 2));
}
if (*(first - 1) == 0 || *(first - 1) != *(last - 1))
{
return(*(unsigned char *)(first - 1) - *(unsigned char *)(last - 1));
}
}
}
for (; x < count; x++)
{
if (*first == 0 || *first != *last)
{
return(*(unsigned char *)first - *(unsigned char *)last);
}
first += 1;
last += 1;
}
return 0;
}
strncmp
和strcmp
基本上就是一样的,就是strncmp
可以指定比较的元素个数。
- 另外,
strncmp
函数比较的时候,如果count
大于4
,那么函数就会把4
个元素4
个元素的比较。
4. strrchr
- 头文件:
string.h
- 功能:
strrchr
函数查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回
NULL
。与之相对应的是strchr
函数,它查找字符串中首次出现指定字符的位置。
char * my_strrchr( const char * string, int ch )
{
char *start = (char *)string;
while (*string++)
;
while (--string != start && *string != (char)ch)
;
if (*string == (char)ch)
return((char *)string);
return(NULL);
}
strrchr
和strchr
刚好相反,strchr
找的是字符串中字符第一次出现的位置;strrchr
找的是字符串中字符最后一次出现的位置。
- 实现
strrchr
的时候定义一个指针,让它指向字符串末尾,然后直接从后往前找就ok。
对于C语言的函数我还在更新中,希望大家给予支持!^_^