C语言—字符/字符串函数—strlen、strcpy、strcat、strcmp、strstr、strtok

目录

1、前言:

2、函数介绍

2.1 strlen

2.2 strcpy

2.3 strcat

2.4 strcmp

2.5 strncpy、strncmp、strncat

2.6 strstr

2.7 strtok

2.8 strerror

3、结语



1、前言:

在c语言中,我们经常会对“字符串”进行操作,当然我们可以用for循环的方式来一个字符一个字符的来处理,或者用以下介绍的字符/字符串函数,操作起来非常的方便。

2、函数介绍

2.1 strlen

size_t strlen(const char * str);
  • strlen功能:字符串已'\0' 作为结束标志,strlen函数返回的是在字符串中'\0' 前面出现的字符个数(不包含'\0' )。

注意:

  1. 参数指向的字符串必须要以'\0' 结束。
  2. strlen函数的返回值是size_t类型的,是无符号的,所以如果两个strlen相减的结果不会出现负数。
  • strlen的模拟实现(可以采用计数的方法、递归的方法、本次代码为指针-指针的方法)
//模拟strlen,用两个指针记录起始和终止位置

void my_strlen(char* pa)
{
	int count = 0;
	char* str = pa;
	while (*pa != '\0')
	{
		pa++;
		count++;

	}
	printf("%d", (pa - str));
}

int main()
{
	
	char arr[] = {"ajkljilbcde"};
	my_strlen(arr);
	return 0;
}

2.2 strcpy

char* strcpy(char* destination, const char* source );
  • strcpy的功能:将源字符中的内容串拷贝到目标字符串中,destination中存入的是目标字符串的元素首地址,source是源字符串的元素首地址。

注意

  1. 源字符串必须以'\0' 结束,如果源字符串没有‘\0’,内存会一直找,直到找到\0结束,这时候如果目标字符串的空间不够,就会发生越界。
  2. 会将源字符串中的'\0' 拷贝到目标空间。
  3. 目标空间必须足够大,以确保能存放源字符串。
  4. 目标空间必须可修改不能是常量字符串
  • strcpy的模拟实现(下面的代码,在while部分还可以简化代码,采用while(*des++ = *src++)

即可实现)

char* my_strcpy(char* des, char* src)
{
	assert(des && src);
	char* ret = des;
	while (*src != '\0' )
	{
		*des = *src;
		des++;
		src++;
	}
	*des = *src;
	return ret;
}

int main()
{
	
	char arr1[20] = {0};
	char arr2[] = { "abcdfd" };
	my_strcpy(arr1, arr2);
	printf("%s",arr1);
	return 0;
}

2.3 strcat

char* strcat (char* destination, const char* source );
  • 将目标函数的字符串添加到源字符串的后面,从‘\0’这个位置来添加。

注意:

  1. 源字符串必须以'\0' 结束。
  2. 目标空间必须有足够的大,能容纳下源字符串的内容。
  3. 目标空间必须可修改。
  4. strcat不能自己给自己追加
  • strcat的模拟实现
char *my_strcat(char *dest, const char*src)
{
    char *ret = dest;
    assert(dest != NULL);
    assert(src != NULL);
    while(*dest)
    {
        dest++;
    }
    while((*dest++ = *src++))
    {
        ;
    }
return ret;
}

2.4 strcmp

int strcmp (const char* str1, const char* str2 );
  • strcmp的功能:比较两个字符串的大小,每次比较的是两个字符的ASCII码值,如果没有字符了,就和‘\0’进行比较,如果两个字符相同,那就向后比较,直到不同或遇到‘\0’

标准规定:

  1. 第一个字符串大于第二个字符串,则返回大于0的数字。
  2. 第一个字符串等于第二个字符串,则返回0。
  3. 第一个字符串小于第二个字符串,则返回小于0的数字。

2.5 strncpy、strncmp、strncat

以上函数,在上述介绍的函数上加上了n,也就是可以指定操作的字符个数,其余方法使用没有太大差别,在这里不过多赘述。

2.6 strstr

char* strstr(const char *str1, const char *str2);
  • strstr的功能是: 在一个字符串中找另一个字符串(在str1中找str2这个字符串),看str2是不是str1的子串,str2如果在str1中出现了,就会返回第一次出现的字符的地址
  • 如果str2在str1中没有出现,那就返回空指针(NULL)。

  • 模拟实现strstr
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);

	const char* s1 = str1;
	const char* s2 = str2;

	const char* cur = str1;
	while (*cur)
	{
		s1 = cur;
		s2 = str2;

		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cur;
		}
		cur++;
	}

	return NULL;//找不到
}
int main()
{
	char arr1[] = "abcdeqcdef";
	char arr2[] = "cdef";
	char* ret = my_strstr(arr1, arr2);
	if (NULL == ret)
	{
		printf("找不到子串\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

注意:

  1. str1(s1),str2(s2),默认指向两个字符串的首字符的地址;
  2. while循环的条件是:s1、s2没有到'\0',s1和s2指向的字符一样。s1指向的是要搜索的字符串("abcdeqabcdef"),s2是遍历的cdef这个字符串。

2.7 strtok

char* strtok (char* str, const char* sep );
  • sep参数是个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针
  • strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL 指针。
  • strtok的用法:

int main ()
{
    char str[] ="- This, a sample string.";
    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
    }
    return 0;
}

2.8 strerror

char* strerror(int errnum);
  • strerror功能:返回错误码对应错误信息的字符串首地址。

3、结语

C语言封装的处理字符串的函数功能很强大,希望大家看了我的博客能有所帮助。

博主肝代码不容易,如果对你有帮助的话,麻烦点个赞呦!!!

猜你喜欢

转载自blog.csdn.net/weixin_44580000/article/details/124273395