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个参数所指地址。
二者的区别
- 最直观的,memcpy()的参数和strncpy()的不同。前者可代表任意内存的地址,后者只能使用字符串类型
- 拷贝时,strncpy()遇到’\0’时就停止拷贝,剩余的用’\0’补齐。如"ch\0ina",当使用strncpy()拷贝8个字符时,它只拷贝ch\0-----,其中-是’\0’,即用5个\0来补齐。而memcpy()则是拷贝ch\0ina\0-这8个字符,其中,和strncpy()不同,-是未定义的字符。
- 两者有一个相同点:第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个字节
二者的区别
- strncmp()只针对字符串比较,而memcmp()针对的是任意内存
- 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的常用操作使用说明
如果有疑问,欢迎评论区下方留言;本人水平有限 ,如有错误,也欢迎在评论区下方批评指正。若是喜欢本文,就帮忙点赞吧!