C语言常见字符串操作函数介绍及其源码实现

1. strcpy

函数源码实现

char *strcpy(char *dest, const char *src)
{
	char *tmp = dest;

	while ((*dest++ = *src++) != '\0');
    
	return tmp;
}

功能:把 src所指向的字符串复制到 dest

参数

  1. dest: 目标字符串首地址
  2. src: 源字符串首地址

返回值:返回指向目标字符串的首地址(指针)

注意事项:如果目标字符串dest长度小于源字符串src的长度,可能会造成缓冲区溢出

2. strncpy

函数源码实现

char *strncpy(char *dest, const char *src, size_t n)
{
	char *tmp = dest;

	while (n) {
		if ((*tmp = *src) != 0)
			src++;
		tmp++;
		n--;
	}
	return dest;
}

功能:把 src所指向的字符串复制n个字符到目标字符串 dest

参数

  1. dest: 目标字符串首地址
  2. src: 源字符串首地址
  3. count: 要从src源字符串复制n个字符

返回值:返回指向目标字符串的首地址(指针)

注意事项

  1. src的长度小于n时,dest的剩余部分将用空字节填充
  2. src的长度大于n时,dest字符串不会有’\0’结束符
  3. n的大小应该小于源字符串和目标字符串的长度

3. strlen

函数源码实现

size_t strlen(const char *str)
{
	const char *sc;

	for (sc = str; *sc != '\0'; sc++);

	return sc - str;
}

功能:计算字符串str的长度,结果不包含字符串结束符’\0’

参数

  1. str: 想要计算长度的字符串

返回值:返回该字符串的长度(不包含结束符)

4. strcat

函数源码实现

char *strcat(char *dest, const char *src)
{
	char *tmp = dest;
	
    /* 找到目标字符串的结尾 */
	while (*dest)
		dest++;
    /* 追加 */
	while ((*dest++ = *src++) != '\0');
    
	return tmp;
}

功能:将一个 ‘\0’ 终止的字符串src追加到另一个字符串dest的结尾处,其中src字符串的结束符’\0’也会追加上去

参数

  1. dest: 目标字符串首地址
  2. src: 源字符串首地址

返回值:返回指向目标字符串的首地址(指针)

注意事项

  1. 源字符串src必须以’\0’结束
  2. 目标字符串的内存空间必须足够容纳追加字符串

5. strncat

函数源码实现

char *strncat(char *dest, const char *src, size_t n)
{
	char *tmp = dest;

	if (n) {
        /* 找到目标字符串结尾 */
		while (*dest)
			dest++;
        /* 从src字符串中追加n个字符到dest中 */
		while ((*dest++ = *src++) != 0) {
            /* n减小到等于0时,提前结束循环 */
			if (--n == 0) {
				*dest = '\0';
				break;
			}
		}
	}
	return tmp;
}

功能:将src中开头的n个字符追加到dest的结尾。如果n大于src的长度,那么只会将src的所有字符追加到dest的尾部

参数

  1. dest: 目标字符串首地址
  2. src: 源字符串首地址
  3. n: 想要追加多少个字符

返回值:返回指向目标字符串的首地址(指针)

注意事项

  1. 目标字符串的内存空间必须足够容纳追加的字符数

6. strcmp

函数源码实现

int strcmp(const char *str1, const char *str2)
{
    while (1) {
        if (*str1 != *str2)
            return (*str1 - *str2);
        if (!*str1)
            break;
        str1++;
        str2++;
    }

    return 0;
}

功能:str1和str2两个字符串进行比较。

参数

  1. str1: 要进行比较的第一个字符串
  2. str2: 要进行比较的第二个字符串

返回值

  1. 如果返回值小于 0,则表示 str1 小于 str2
  2. 如果返回值大于 0,则表示 str1 大于 str2
  3. 如果返回值等于 0,则表示 str1 等于 str2

注意事项

  1. str1、str2两个字符串比较时,只要判断到有一个字符不相等,就相当于他们是不同的字符串了,而且大小判断也是依据这个字符出的ASCII码的大小判断谁大谁小的。比如:"ab"和"aBCD"这两个字符串,因为第二个位置的字符’b’大于’B’所以是"ab"这个字符串大于"aBCD"这个字符串

7. strncmp

strncmp函数和strcmp函数用法是一样的,只不过strncmp函数指定了比较的最大字符数。

函数源码实现

int strncmp(const char *str1, const char *str2, size_t n)
{
    while (n) {
        if (*str1 != *str2)
            return (*str1 - *str2);
        if (!*str1)
            break;
        str1++;
        str2++;
        n--;
    }

    return 0;
}

功能:str1和str2两个字符串进行比较,最多比较前n个字符。比较过程中,如果任何一个字符串的长度小于n,那么只会比较较短的字符串的长度。

参数

  1. str1: 要进行比较的第一个字符串
  2. str2: 要进行比较的第二个字符串
  3. n: 要进行比较的最大字符数

返回值

  1. 如果返回值小于 0,则表示 str1 小于 str2
  2. 如果返回值大于 0,则表示 str1 大于 str2
  3. 如果返回值等于 0,则表示 str1 等于 str2

8. strchr

函数源码实现

char *strchr(const char *str, int c)
{
	for (; *str != (char)c; str++)
    {
        if (*str == '\0')
			return NULL;
    }	
	return (char *)str;
}

功能:在字符串str中查找字符c首次出现的位置

参数

  1. str: 要查找的字符串首地址
  2. c: 想要查找的匹配字符

返回值

  1. 成功则返回第一次出现字符c的位置(或者说地址)
  2. 失败则返回NULL

9. strrchr

函数源码实现

char *strrchr(const char *str, int c)
{
	const char *last = NULL;
	do {
		if (*str == (char)c)
			last = str;
	} while (*str++);
	return (char *)last;
}

功能:在字符串str中查找字符c最后一次出现的位置(或者说反向查找字符串str第一次出现字符c的位置)

参数

  1. str: 要查找的字符串首地址
  2. c: 想要查找的匹配字符

返回值

  1. 成功则返回最后一次出现字符c的位置(或者说地址)
  2. 失败则返回NULL

10. strstr

函数源码实现

char *strstr(const char *haystack, const char *needle)
{
	size_t l1, l2;

	l2 = strlen(needle);
	if (!l2)
		return (char *)haystack;
	l1 = strlen(haystack);
	while (l1 >= l2) {
		l1--;
		if (!memcmp(haystack, needle, l2))
			return (char *)haystack;
		haystack++;
	}
	return NULL;
}

功能:在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。比如在字符串"aaabcd123gggab123abcd"中查找"123"这个字符串,那么返回的就是"123"这个字符串,在字符串"aaabcd123gggab123abcd"中首次出现的位置(地址)。

参数

  1. haystack : 要查找的源字符串首地址
  2. needle : 匹配的字符串首地址

返回值

  1. 成功则返回最后一次出现字符串 needle 的位置(或者说地址)
  2. 失败则返回NULL

11. strpbrk

函数源码实现

char *strpbrk(const char *str1, const char *str2)
{
	const char *sc1, *sc2;

	for (sc1 = str1; *sc1 != '\0'; sc1++) {
		for (sc2 = str2; *sc2 != '\0'; sc2++) {
			if (*sc1 == *sc2)
				return (char *)sc1;
		}
	}
	return NULL;
}

功能:搜索字符串str1中,第一个匹配字符串str2中的字符,然后返回该字符所在的位置,不包含字符串结束符。

参数

  1. str1: 要检索的字符串
  2. str2: 给出想要在str1匹配的字符串

返回值

  1. 成功,则返回str1第一个匹配的字符所在的位置。例如str1字符串"123ABCDEFG",str2为"CDE",那么检索后返回的就是字符串str1中字符’C’的位置(地址)
  2. 没有检索到匹配的字符,那么返回NULL

12. strreplace

函数源码实现

char *strreplace(char *str, char old, char new)
{
    char *tmp = str;
	for (; *tmp; tmp++)
		if (*tmp == old)
			*tmp = new;
	return str;
}

功能:使用新的字符new替换字符串中所有出现的old字符

参数

  1. str: 要替换的字符串的首地址
  2. old: 想要替换字符串中出现的哪个字符
  3. new: 使用新的字符去替换old字符

返回值:返回传递进的str字符串的首地址

你可能感兴趣的:(C语言,c语言,字符串)