C库函数string.h——字符串常用函数说明及使用注意

strlen()

函数原型:size_t strlen(const char *str)
说明:计算并返回字符串 str 的长度,直到空结束字符,但不包括空结束字符。size_t是一种无符号类型。
举例:如char* str=“China”,strlen(str)返回5。

实例:

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

int main()
{
	char str[50] = "China";
	int len;

	len = strlen(str);
	printf("|%s| 的长度是 |%d|\n", str, len);

	system("pause");
	return 0;
}

VS2013打印结果为:

|China| 的长度是 |5|

strcmp()

函数原型:int strcmp(const char *str1, const char *str2)
说明:把 str1 所指向的字符串和 str2 所指向的字符串进行比较。方法是依次比较 str1 和 str2 的每一个字符,直到出现不等的字符,或者到达字符串末尾’\0’。

  • 若str1>str2,函数返回正整数
  • 若str1=str2,函数返回0
  • 若str1<str2,函数返回负整数

举例:如char* str1=“China”;char* str2=“ChinA”; 由于a大于A,所以str1 > str2。

实例:

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

int main()
{
    char str1[15] = "abcdef";
	char str2[15] = "abcdef";
	int ret;

	ret = strcmp(str1, str2);

	if (ret < 0){
		printf("str1 小于 str2");
	}
	else if (ret > 0){
		printf("str1 大于 str2");
	}
	else{
		printf("str1 等于 str2");
	}
    
    
	system("pause");
	return 0;
}

VS2013打印结果为:

str1 等于 str2

strcpy()

函数原型:char *strcpy(char *dest, const char *src)
说明:把 src 所指向的字符串复制到 dest。返回指向dest 的指针。注意,当dest的空间小与src的大小时,会造成缓存溢出。
使用注意:若是有字符串str1=“abcde”,str2=“ABC”。这种情况下做strcpy(str1,str2),之中返回的是字符串"ABC\0e"。因为copy的过程是这样的操作:( (*dst++) = (*src++) ) != ‘\0’

实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char str1[] = "Sample string";
	char str2[40];
	char str3[40];
	strcpy(str2, str1);
	strcpy(str3, "copy successful");
	printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
    
    
	system("pause");
	return 0;
}

VS2013打印结果为:

 str1: Sample string 
 str2: Sample string 
 str3: copy successful

注意:vs2013中,使用strcpy会报错:This function or variable may be unsafe.我们需要在main.cpp开头定义宏定义_CRT_SECURE_NO_WARNINGS

strcat()

函数原型:char *strcat(char *dest, const char *src)
说明:把src所指向的字符串(包括’\0’)添加到dest结尾处(覆盖原dest结尾处的’\0’),返回指向dest的指针。
使用注意:dest必须有足够的空间来容纳src的字符串,否则程序运行会出错。如实例中,若dest数组的大小为20,运行时出错。

实例:

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

int main()
{
    char src[50], dest[50];

	strcpy(src, "This is source");
	strcpy(dest, "This is destination");

	strcat(dest, src);

	printf("最终的目标字符串: %s\n", dest);
    
    
	system("pause");
	return 0;
}

VS2013打印结果为:

 最终的目标字符串: This is destinationThis is source

memset()

函数原型:void *memset(void *str, int c, size_t n)
说明:将str所指内存的前n个字节的大小设置为c。
使用注意:memset是按单个字节设置n个。所以假设int a[4] = {1,2,3,4},执行memset(a,0,4);后,并不能将数组a全部元素设置为0,只能将前a地址开始的4个字节设置为0。又int占4个字节,所以执行完后的结果为 a= {0,2,3,4}。

实例:

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

int main()
{
    char str[50];

	strcpy(str, "This is string.h library function");
	puts(str);

	memset(str, '$', 4);
	puts(str);
    
    
	system("pause");
	return 0;
}

VS2013打印结果为:

 This is string.h library function    
 $$$$ is string.h library function

memcpy()和strncpy()

memcpy()函数原型:void *memcpy(void *str1, const void *str2, size_t n)
strncpy()函数原型:char *strncpy(char *dest, const char *src, size_t n)
说明:二者都是将第2个参数所指地址的 n 个字节拷贝到第1个参数所指地址。

二者的区别

  1. 最直观的,memcpy()的参数和strncpy()的不同。前者可代表任意内存的地址,后者只能使用字符串类型
  2. 拷贝时,strncpy()遇到’\0’时就停止拷贝,剩余的用’\0’补齐。如"ch\0ina",当使用strncpy()拷贝8个字符时,它只拷贝ch\0-----,其中-是’\0’,即用5个\0来补齐。而memcpy()则是拷贝ch\0ina\0-这8个字符,其中,和strncpy()不同,-是未定义的字符。
  3. 两者有一个相同点:第1个参数和第2个参数的内存不能重叠。

验证区别2:

#define _CRT_SECURE_NO_WARNINGS

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


int main()
{
	const char src[7] = "Ch\0ina";
	char dest[8];
	char dest2[8];

	memcpy(dest, src, 8);
	strncpy(dest2, src, 8);

	printf("*****memcpy()*****\n");

	for (int mcpy = 0; mcpy < sizeof(dest);mcpy++)
		printf("%c|", dest[mcpy]);
	printf("\n");
	printf("dest = %s\n", dest);

	printf("*****strncpy()*****\n");



	for (int scpy = 0; scpy < sizeof(dest2); scpy++)
		printf("%c|", dest2[scpy]);
	printf("\n");
	printf("dest2 = %s\n", dest2);

	system("pause");
	return 0;
}

VS2013打印结果:
在这里插入图片描述
memcpy()拷贝的第8个字符是未定义的,所以用%c打印是乱码。

memcmp()和strncmp()

memcmp()函数原型:int memcmp(const void *str1, const void *str2, size_t n)
strncmp()函数原型:int strncmp(const char *str1, const char *str2, size_t n)
说明:二者都是比较第一个参数和第2个参数的前n个字节

二者的区别

  1. strncmp()只针对字符串比较,而memcmp()针对的是任意内存
  2. strncmp()比较,当还没比较到n个字符时,就遇到空字符’\0’,此时结束比较。而memcmp()比较,即使字符串已经结束(即遇到’\0’),仍然要比较剩余的空间,直到比较完n个字节。看下面实例。

验证区别2:

#define _CRT_SECURE_NO_WARNINGS

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

void display(int r)
{
	if (r > 0)
		printf("str1大于str2");
	else if (r < 0)
		printf("str1小于str2");
	else
		printf("str1等于str2");

}

int main()
{
	const char str1[10] = "Ch\0ina";
	const char str2[10] = "Ch\0Ina";

	printf("*****memcmp()*****\n");
	int rtn1 = memcmp(str1, str2, 4);
	display(rtn1);

	printf("\n*****strncmp()*****\n");
	int rtn2 = strncmp(str1, str2, 4);
	display(rtn2);
	printf("\n");

	system("pause");
	return 0;
}

打印结果:
在这里插入图片描述

memmove()

函数原型:void *memmove(void *str1, const void *str2, size_t n)
说明:从 str2 复制 n 个字符到 str1。功能和memcpy()相同,但是当str1和str2所指内存有重叠时,memmove() 能够保证源串str2在被覆盖之前将重叠区域的字节拷贝到目标区域str1,所以它比memcpy()更安全。

下面我们看一看VS给memmove()的源码,安装了VS一般的路径为:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src。

void * __cdecl memmove(void * dst,const void * src,size_t count)
{
	void * ret = dst;

	if (dst <= src || (char *)dst >= ((char *)src + count)) {
		/*
		* Non-Overlapping Buffers
		* copy from lower addresses to higher addresses
		*/
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}
	else {
		/*
		* Overlapping Buffers
		* copy from higher addresses to lower addresses
		*/
		dst = (char *)dst + count - 1;
		src = (char *)src + count - 1;

		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}
	return(ret);
}

可以看到,memmove()的拷贝分了两种情况。一是dst和src的地址没有重叠,此时正常拷贝;二是dst和src的地址有重叠,此时拷贝是从后面向前拷贝。

以上就是C库文件string.h的常用操作使用说明
如果有疑问,欢迎评论区下方留言;本人水平有限 ,如有错误,也欢迎在评论区下方批评指正。若是喜欢本文,就帮忙点赞吧!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值