常用的字符串函数详解

  • 以下介绍的字符串函数都是在<string.h>的头文件下的

strlen()

介绍

  • 函数模型:size_t strlen( const char * string );
  • 参数:一个字符串
  • 返回值是size_t(unsigned int),无符号整数,因为字符串长度不可能是负数,因此返回值是一个无符号整数

作用

  • 求字符串的长度,并且在计数过程中遇到’\0’,就会停止计数,返回’\0’之前的字符个数

举例使用strlen()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "abcdefg";
	printf("%u", strlen(str));
	//因为strlen()函数返回的是无符号整数,因此最正确的写法是打印%u,%u是打印无符号整数,当然如果这里写成%d也可以
	return 0;
}

模拟实现strlen()函数

#include <stdio.h>

int my_strlen(const char* s)
{
	char* p = s;
	if (*p == '\0')//当遇到'\0'时,就停止计数
		return 0;
	return 1 + my_strlen(p + 1);
}
int main()
{
	char str[] = "abcdefg";
	int len = my_strlen(str);
	printf("%d\n", len);
	return 0;
}

strcpy()

介绍

  • 函数模型:char * strcpy( char * str1, const char * str2 );
  • 参数:目标字符串和被拷贝字符串

作用

  • 字符串拷贝,将字符串str2的内容拷贝到字符串str1中

举例使用strcpy()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[20];
	char str2[] = "abcdef";
	strcpy(str1, str2);//将字符串str2的内容拷贝到字符串str1中
	printf("%s", str1);
	return 0;
}

模拟实现strcpy()函数

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* str)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(str != NULL);
	while (*dest++ = *str++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "###############";
	char arr2[] = "bits";
	printf("%s\n", my_strcpy(arr1, arr2));
 	return 0;
}

strcpy()函数注意事项

  • strcpy()函数在使用时,目标字符串的空间必须足够大(比被拷贝的字符串空间大,因为strcpy是当遇到’\0’是才会停止拷贝),这样才能正常使用,如果空间太小,就无法使用,因此在有些编译器(比如VS)中会认为该函数不安全
  • 但是在C语言的库中,还有另一个字符串拷贝函数----strncpy(),相比于strcpy()函数更安全

strncpy()函数

介绍

  • 函数模型:char * strncpy( char * str1, const char * str2, size_t count );
  • 相比于strcpy()函数,strncpy()函数多了一个参数,该参数是用来限定拷贝的长度的

举例使用strncpy()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[20] = "################";
	char str2[] = "abcdef";
	strncpy(str1, str2, 2);
	printf("%s", str1);
	return 0;
}
  • 运行结果

在这里插入图片描述

strcat()

介绍

  • 函数模型:char * strcat( char * str1, const char * str2 );

作用

  • 将字符串str2追加到字符串str1后面

举例使用strcat()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[10] = "abcd";
	char str2[] = "efg";
	strcat(str1, str2);
	printf("%s", str1);
	return 0;
}
  • 运行结果
    在这里插入图片描述

模拟实现strcat()函数

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest,const char* src)
{
	assert(dest && src);
	char* p = dest;
	//找到'\0'
	while (*++dest)
	{
		;
	}
	//开始追加
	while (*dest++ = *src++)
	{
		;
	}
	return p;
}

int main()
{
	char arr1[20] = "abcd";
	char arr2[] = "efg";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcat()函数注意事项

  • 与strcpy()函数一样,strcat()同样存在不安全的情况,当strcat()追加自己时,就无法完成
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[10] = "abcd";
	char str2[] = "efg";
	strcat(str1, str1);
	printf("%s", str1);
	return 0;
}

上诉代码无法完成对自己的追加

  • 此时可以用strncat()函数

strncat()函数

介绍

  • 函数模型:char * strncat( char * str1, const char * str2, size_t count );
  • 相比于strcat()函数,多增加的参数是要追加的数量

举例使用strncat()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[10] = "abcd";
	strncat(str1, str1, 4);
	printf("%s", str1);
	return 0;
}

strcmp()

介绍

  • 函数模型:int strcmp( const char * string1, const char * string2 );

作用

  • 比较字符串大小内容(不是长度)(参考字典序)(ASCII值),若string1>string2,返回一个大于0的数,若string1=string2,返回0,若string1 < string2,返回小于0的数。

举例使用strcmp()函数

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "abcd";
	char str2[] = "abce";
	int ret = strcmp(str1, str2);
	printf("%d", ret);
	return 0;
}

在这里插入图片描述

strncmp()函数

  • 同上面函数一样,比strcmp()函数多了一个参数,比较的个数
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "abcd";
	char str2[] = "abce";
	int ret = strncmp(str1, str2, 3);
	printf("%d", ret);
	return 0;
}

在这里插入图片描述

strstr()

介绍

  • 函数模型:char * strstr( const char * string, const char * strCharSet );

作用

  • 字符串查找函数,如果字符串strCharSet在字符串string中,返回第一次出现的位置的指针,若不在string中,则返回空指针

举例使用strstr()函数

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "dhafjkhsdabcdrewtertwert";
	char str2[] = "abc";
	char* ret = strstr(str1, str2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}
  • 运行结果
    在这里插入图片描述

模拟实现strstr()函数

#include <stdio.h>
#include <assert.h>

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	char* p1;
	char* p2;
	char* cp = str1;//记录可能成功的值
	while (*cp != '\0')
	{
		p1 = cp;
		p2 = str2;
		/*while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)*/
		while (*p1 && *p2 && *p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
			return cp;
		if (*p1 == '\0')
			return NULL;
		cp++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "I am a good student, hehe";
	char arr2[] = "student";
	char* ret = my_strstr(arr1, arr2);
	printf("%s\n", ret);
	return 0;
}

strtok()

介绍

  • 函数模型:char * strtok( char * str, const char * strDelimit );
  • strDelimit是分隔符字符集

作用

  • strtok()是用来切割字符串的
  1. 第一个参数指定一个字符串,它包含了0个或多个由strDelimit字符串中一个或多个分隔符分割的标记。
  2. strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操控的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)。
  3. strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串中的位置。
  4. strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

举例使用strtok()函数

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "15145j@qq.com";
	char arr2[100] = { 0 };
	strcpy(arr2, arr1);
	char sep[] = "@.";
	char* ret = NULL;
	for (ret = strtok(arr2, sep);ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}
	/*strtok(arr2, sep);
	strtok(NULL, sep);*/
	return 0;
}
  • 运行结果
    在这里插入图片描述
  • 51
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
C语言字符串函数的原型可以在C标准库的string.h头文件中找到。其中一些常用字符串函数的原型如下: 1. strlen函数的原型是:size_t strlen(const char *str); 这个函数用于计算字符串的长度,返回的是字符串中字符的个数,不包括空字符'\0'。 2. strcpy函数的原型是:char *strcpy(char *dest, const char *src); 这个函数用于将源字符串src复制到目标字符串dest中,并返回目标字符串的指针。 3. strcat函数的原型是:char *strcat(char *dest, const char *src); 这个函数用于将源字符串src追加到目标字符串dest的末尾,并返回目标字符串的指针。 4. strcmp函数的原型是:int strcmp(const char *str1, const char *str2); 这个函数用于比较两个字符串str1和str2的大小关系。如果str1小于str2,则返回一个负数;如果str1等于str2,则返回0;如果str1大于str2,则返回一个正数。 5. strchr函数的原型是:char *strchr(const char *str, int c); 这个函数用于在字符串str中查找字符c的第一次出现,并返回该字符的指针。 这些函数只是C语言字符串函数中的一部分,还有很多其他的字符串函数可以在string.h头文件中找到。 #### 引用[.reference_title] - *1* [C语言字符串函数及如何实现这些函数](https://blog.csdn.net/weixin_29007243/article/details/117020047)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【经典】C语言字符串函数原型](https://blog.csdn.net/sinat_36184075/article/details/69372144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [字符串查找函数C语言字符串查找函数详解](https://blog.csdn.net/weixin_35433448/article/details/117013859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会掉发的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值