字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp

一.strcpy(字符串拷贝)

1.函数使用

char* strcpy(char* destination, const char* source);
  • strcpy函数用于拷贝字符串,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指针,第一个指针指向目标字符串的首地址,即要拷贝到什么地方。第二个指针指向来源字符串的首地址,即用什么字符串拷贝。返回值是目标字符串的首地址
#include<stdio.h>
#include<string.h>
int main()
{
	//char* p = NULL;
	//p = "zhangsan";//p是指针变量,可以赋值,将z的地址赋值给p
	//char name[20] = "xxxxxxxxxx";
	//name = "zhangsan";//err,name数组名是地址,地址是一个常量值,不能被赋值,name已经被固定死了

	char name1[20] = "xxxxxxxxxx";
	char str1[] = "zhang\0san";
	strcpy(name1, str1);
	printf("%s\n", name1);
	
	char name2[20] = "xxxxxxxxxx";
	char str2[] = { 'b','i','t' };
	strcpy(name2, str2);
	printf("%s\n", name2);

	//char* p = "abcdef";//p指向常量字符串,存放a的地址,常量字符串是不能修改的
	//char arr[] = "bit";
	//strcpy(p, arr);//err

	//char p[] = "abcdef";//将其放入数组中,使其变成变量可以修改
	//char arr[] = "bit";
	//strcpy(p, arr);//right
	return 0;
}

在这里插入图片描述

  • 我们看到会将源字符串末尾的’\0’,一同拷贝到目标字符串,当源字符串末尾没有’\0’的时候,会一直向后查找,直到找到’\0’为止,停止拷贝,并将’\0’拷贝到目标字符串。

总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。

2.模拟实现

  • 进入函数体时先定义一个指针变量保存目标空间的起始位置,便于之后返回。然后将源字符串中的字符一一赋值给目标空间,直到遇到源字符串中的’\0’,将’\0’也赋值给目标空间后结束赋值,并返回目标空间的起始位置。
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{
	assert(str != NULL);//断言,若str为NULL,报错,头文件assert.h
	//或者直接assert(destination && source);
	char* str = destination;//保存目标空间的起始位置
	while (*source != '\0')//或者直接while (*source)
	{
		*destination++ = *source++;
	}
	*destination = *source;
	return str;
}
  • 还可以这样更加简洁一些:
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{
	assert(str != NULL);//断言,若str为NULL,报错,头文件assert.h
	char* str = destination;
	while (*destination++ = *source++;)
	{
		;
	}
	return str;
}

二.strcat(字符串追加)

1.函数使用

char *strcat( char* destination, const char* Source );
  • strcat函数用于追加字符串,即将一个字符串中的内容追加到另一个字符串中。它的参数是两个指针,第一个指针指向目标字符串的首地址,即要追加到什么地方。第二个指针指向来源字符串的首地址,即用什么字符串追加。返回值是目标字符串的首地址
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	strcat(arr1, "world");
	printf("%s\n", arr2);

	char arr3[20] = "hello ";
	char arr4[] = { 'a','b','c','d','e','f' };
	strcat(arr3, arr4);
	printf("%s\n", arr3);
	return 0;
}

在这里插入图片描述

  • 我们看到会将源字符串末尾的’\0’,一同追加到目标字符串,当源字符串末尾没有’\0’的时候,会一直向后查找,直到找到’\0’为止,停止追加,并将’\0’追加到目标字符串。

总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的⼤,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 字符串不能自己给自己追加('\0’被覆盖,无终止条件,陷入死循环),这就是源字符串不能被修改的原因。

2.模拟实现

  • 进入函数体依然先定义一个指针变量用于存放目标空间的起始位置,便于之后返回。然后用循环先找到目标空间的’\0’,之后从’\0’的位置开始追加源字符串的内容,直到追加到源字符串中的’\0’为止。最后返回目标空间的起始位置。
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{
	assert(destination && source);//断言,若str为NULL,报错,头文件assert.h
	char* str = destination;//保存目标空间的起始位置
	//找到'\0'的位置
	while (*destination != '\0')
	{
		destination++;
	}
	//开始追加字符串
	while (*source != '\0')
	{
		*destination++ = *source++;
	}
	//添加'\0'
	*destination = *source;
	return str;
}
  • 还可以这样更加简洁一些:
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{
	assert(destination && source);
	char* str = destination;
	while (*destination != '\0')
	{
		destination++;
	}
	while (*destination++ = *source++)
	{
		;
	}
	return str;
}

三.strcmp(字符串比较)

1.函数使用

int strcmp(const char* str1,const char* str2)
  • strcmp函数用于比较两个字符串内容的函数。它的参数是两个指针,指针分别指向两个待比较字符串的首地址。它的返回值是一个整型数字。
  • 依次比较的是对应字符的ASCII值。
  • 当str1 > str2的时候返回正数。
  • 当str1 == str2的时候返回0。
  • 当str1 < str2的时候返回负数。
//错误的写法
#include<stdio.h>
int main()
{
	char arr1[] = "zhangsan";
	char arr2[] = "zhangsan";
	if (arr1 == arr2)
		printf("==\n");
	else
		printf("!=\n");//输出!=
	return 0;
}
  • 我们比较数组也许会像上面这样写,但是数组名是首元素的地址,实际上比较的是两个地址,这两个数组内容虽然一样,但它们是在栈区开辟的两个不同的空间,地址是不一样的,所以无论如何都打印不出==。
//正确的比较方法
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "zhangsan";
	char arr2[] = "zhangsan";
	int ret = strcmp(arr1, arr2);
	if (ret < 0)
		printf("<\n");
	else if (ret == 0)
		printf("==\n");//输出==
	else
		printf(">\n");
	return 0;
}

总结:

  • 第⼀个字符串大于第⼆个字符串,则返回大于0的数字。
  • 第⼀个字符串等于第⼆个字符串,则返回0。
  • 第⼀个字符串小于第⼆个字符串,则返回⼩于0的数字。
  • 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

2.模拟实现

  • 进入函数体直接比较起始位置的字符的大小。如果相同并且不为’\0’那么继续比较下一对字符的大小;如果相同并且为’\0’那么说明字符串比较完毕,那么直接返回0;如果不同则直接返回str1与str2中对应字符的ASCII值的差值(当str1中对应字符大于str2中的对应字符时返回正值,当str1中对应字符小于str2中的对应字符时返回负值)。
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);//断言,若str为NULL,报错,头文件assert.h
	while (*str1 == *str2)
	{
		//遇到都为'\0'的时候,说明字符串相等返回0
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return (*str1 - *str2);
}

以上三种字符串函数都是长度不受限制的字符串,直到’\0’为止,那有没有长度受限制的字符串函数呢?答案是有的,以下一一为您介绍。

四.strncpy

1.函数使用

char* strncpy (char* destination, const char* source, size_t num);

strncpy的参数与strcpy相比较多出了一个参数,而这个参数就是被拷贝的字符的个数。

注意:

  1. num小于等于源字符串中的字符个数时,被拷贝的字符的个数由num决定。
  2. num大于源字符串中字符的个数时,strncpy函数将源字符串中的字符拷贝到目标空间后不够的将用’\0’填充。

例如:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "xxxxxxxxxx";
	char arr2[20] = "xxxxxxxxxx";
	char arr3[] = "aaaaa";
	strncpy(arr1, arr3, 3);
	strncpy(arr2, arr3, 7);
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

arr1:“aaaxxxxxxx…”,arr2:“aaaaa\0\0xxx…”。(…表示还有10个\0)。
在这里插入图片描述

2.模拟实现

char* my_strncpy(char* destination, const char* source, size_t num)
{
	assert(destination && source);
	char* ret = destination;
	while (*source != '\0' && num)//找到\0停止,或num==0停止
	{
		*destination++ = *source++;
		num--;
	}
	while (num)//若num!=0,在后面补\0,直到num==0
	{
		*destination++ = '\0';
		num--;
	}
	return ret;
}

五.strncat

1.函数使用

char* strncat (char* destination, const char* source, size_t num);

strncat的参数与strcat相比较多出了一个参数,而这个参数就是被追加的字符的个数。

注意:

  1. num小于源字符串中的字符个数时,被追加的字符的个数由num决定,并在追加完后再追加一个’\0’。
  2. num大于等于源字符串中的字符个数时,将源字符串内容全部追加到目标空间便结束追加,并在追加完后再追加一个’\0’。

例如:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "xxxxx\0xxxx";
	char arr2[20] = "xxxxx\0xxxx";
	char arr3[] = "aaa";
	strncat(arr1, arr3, 2);
	strncat(arr2, arr3, 5);
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

在这里插入图片描述
arr1:“xxxxxaa\0xx…”,arr2:“xxxxxaaa\0x…”。(…表示还有10个\0)。

2.模拟实现

char* my_strncat(char* destination, const char* source, size_t num)
{
	assert(destination && source);
	char* ret = destination;
	while (*destination != '\0')//找到\0停止
	{
		destination++;
	}
	while (*source!='\0' && num)//追加字符的两个条件
	{
		*destination++ = *source++;
		num--;
	}
	if (num > 0)//说明*source=='\0',最后补上'\0',即可
	{
		*destination = *source;
	}
	return ret;
}

六.strncmp

1.函数使用

int strncmp ( const char * str1, const char * str2, size_t num );

strncmp的参数与strcmp相比较也多出了一个参数,而这个参数也就是需要比较的字符个数。

例如:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int ret1 = strncmp(arr1, arr2, 3);
	int ret2 = strncmp(arr1, arr2, 4);
	return 0;
}
  • 当num为3时,我们比较了arr1和arr2的前3个字符,而它们前3个字符都相同,所以返回的是0;
  • 当num为4时,我们比较了arr1和arr2的前4个字符,因为字符’d’的ASCII值大于字符’\0’的ASCII值,所以返回一个正值。

2.模拟实现

int my_strncmp(const char* str1, const char* str2, size_t num)
{
	assert(str1 && str2);
	while (*str1 == *str2 && num)//保证比较前num个字符
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
		num--;
	}
	return *str1 - *str2;
}

字符串函数(一)到这就结束了,还有字符串函数(二)哦!!!!
创作不易,如果能帮到你的话能赏个三连吗?感谢啦!!!
在这里插入图片描述

  • 88
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 53
    评论
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值