当前位置:首页 » 《随便一记》 » 正文

string.h头文件中十一个重要的函数,笔记已经上传至gitee_Rinne's blog

6 人参与  2022年03月06日 16:15  分类 : 《随便一记》  评论

点击全文阅读


string.h头文件中十一个重要的函数,笔记已经上传至gitee

笔记指路:函数
不仅仅有本文的函数,还持续更新其他函数类型的解释


文章目录

  • string.h头文件中十一个重要的函数,笔记已经上传至gitee
    • 一、strcat 字符串追加
      • 1. strncat
    • 二、strstr 字符串查找
    • 三、strlen 求字符串长度
    • 四、strcpy 字符串拷贝
      • 1. strncpy
    • 五、strcmp 字符串比较
      • 1. strncmp
    • 六、strtok 字符串划分
    • 七、memcpy 内存拷贝
    • 八、memmove 内存移动
    • 九、memcmp 内存比较
    • 十、memset 内存重置
    • 十一、strerror 错误信息


一、strcat 字符串追加

char * strcat ( char* strDestination, const char* strSource);

长度不受限制的字符串函数(与长度无关,不够安全)

返回类型:char * (目标空间的起始地址,dest)

参数类型:char * 、 const char*

前者是所要加添到目标数组,后者是需要加添的字符串(数组)

用途:在字符数组后面追加,黏贴另外一个数组


条件:

追加的时候保证目标空间足够大

追加的内容里必须有’\0’

char arr1[10] = "abs";
char arr2[] = "sd";

strcat(arr1, arr2);

1. strncat

char *strncat( char *strDest, const char *strSource, size_t count );

返回值:Each of these functions returns a pointer to the destination string.

这些函数都返回一个指向目标字符串的指针

字符串给自己添加自己的字符的时候

长度受限制的字符串函数

char arr[6] = "abc";
strncat(arr, arr, 2);//arr 变成 abcab

char arr1[10] = "abs";
char arr2[] = "shd";
strncat(arr1, arr2, 6);//这里就算超过了追加数组的范围也只会加添到
//'\0'停止追加,与strncpy不同

二、strstr 字符串查找

查找字符串

char arr1[] = "ashwncecd";
char arr2[] = "hwn";
char* p = strstr(arr1, arr2);//在arr1中,找arr2字符串

如果找到了,返回第一次出现相同字符,对应字符的地址(在查找的字符串里的字符)

如果没有找到,则返回空指针,如果查找的字符串是空字符串(只有’\0’),则返回被查找字符串的起始地址

三、strlen 求字符串长度

形参类型:const char* string

返回类型:size_t 无符号整型 – unsigned int

求字符串长度,遇到’\0’则停止

char arr[] = "abcdef";
int sz = strlen(arr);

易错点:

char arr1[] = "abc";
char arr2[] = "abcde";
if(strlen(arr1) - strlen(arr2) < 0)
{
 printf("1");
}
else
{
 printf("0");
}

分析:这里的strlen(arr1) - strlen(arr2)

因为计算机在处理不同类型数相加减时,哪个能表示更大的数就转为哪个类型,这里只有unsigned int类型,最大值为2^32-1,所以往unsigned int 转,所以结果为一个无符号整型是整数


四、strcpy 字符串拷贝

字符串拷贝

长度不受限制的字符串函数(与长度无关,不够安全)

将一个字符串拷贝到另外一个字符串中

char* strcpy ( char * strDestination, const char* strSource );

char arr1[20] = "abc";
char arr2[] = "abdws";
strcpy(arr1, arr2);
//将arr2的内容拷贝到arr1中,记得判断arr1的大小是否>=arr2

只拷贝到第一个’\0’截止

拷贝的内容必须有’\0’,不然会非法越界访问

目标空间需要足够大

目标空间必须可以改变(前没有const)


1. strncpy

长度受限制的字符串函数

char *strncpy( char *strDest, const char *strSource, size_t count );

返回值:Each of these functions returns strDest (返回目标数组首元素地址)


char arr1[20] = "abcdef";
char arr2[] = "xshw";

strncpy(arr1, arr2, 4);//将4个字符拷贝进去
strncpy(arr1, arr2, 7);//遇到'\0'停止,剩下3个字符由'\0'代替

五、strcmp 字符串比较

比较两个字符串内容大小,而不是长度

长度不受限制的字符串函数(与长度无关,不够安全)

参数:int strcmp( const char *string1, const char *string2 );

返回值:

ValueRelationship of string1 to string2
< 0string1 less than string2
0string1 identical to string2
> 0string1 greater than string2

注意:

返回负数或者正数不一定是 - 1 或者 1

比较到其中一个字符串遇到’\0’,或两个字符不相等时停止


实例:

char arr1[] = "abcd";
char arr2[] = "abd";
int ret = strcmp(arr1, arr2);

比较到c和d两个元素,c比d小,所以arr1相对而言比较小

返回负数


1. strncmp

长度受限制的字符串函数

int strncmp( const char *string1, const char *string2, size_t count );

指定比较到几个字符

返回值:

Return ValueDescription
< 0string1 substring less than string2 substring
0string1 substring identical to string2 substring
> 0string1 substring greater than string2 substring

六、strtok 字符串划分

char *strtok( char *strToken, const char *strDelimit );

被划分的字符串, 用作划分的符号的集合

返回值:All of these functions return a pointer to the next token found in strToken.

返回标记元素的首元素地址,如果标记查找完,返回空指针

被划分的字符串中需要包含,分割符号


  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存这个标记之后的字符在字符串中的位置

  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记,之后做相同动作

  • ps:该函数有记忆功能,其中可能有静态变量

char arr[] = "rinne@163.com";
char arr1[20] = {0};//临时数据,备份,防止之前的被修改了
char del[] = "@.";

strcpy(arr1, arr);

strtok(arr1, del);//第一个参数不为NULL
//将@改成'\0',并且返回r的地址
//这里 rinne  163  com 均为标记
//此时strtok函数记住了1的地址
strtok(NULL, del);
//此时strtok,从1开始寻找,下一个标记,是163
//将163后的.改为'\0',返回1的地址
//此时strtok函数又记住了c的地址

常规操作:

char arr1[] = "rinne@csdn.com";
char arr2[20] = {0};//临时数据
char del[] = "@.";

strcpy(arr2, arr1);

char* ret = NULL;//记住标记的首元素地址,以打印

for(ret = strtok(arr2, del); ret != NULL; 
    ret = strtok(NULL, del))
{
    printf("%s\n", ret);
}

七、memcpy 内存拷贝

内存拷贝

void *memcpy( void *dest, const void *src, size_t count );

目标地址,需要拷贝的地址,需要拷贝数据的大小

返回类型:dest的首元素地址

int arr1[] = {1, 2, 3, 4, 5};
int arr2[10] = {0};

memcpy(arr2, arr1, 5 * sizeof(arr1));
//打印出来 arr2 是 1 2 3 4 5 0 0 0 0 0

memcpy 拷贝自己

拷贝重叠的部分时候,可能会出现错误

但在vs不会出现这种情况


八、memmove 内存移动

在遇到拷贝重叠部分时候使用

理解上可以认为,memmove包含了memcpy

void *memmove( void *dest, const void *src, size_t count );

返回类型:dest的首元素地址

int arr[] = {1, 2, 3, 4, 5};
memcpy(arr + 1, arr, 12);//拷贝 1 2 3 到 2 3 4

九、memcmp 内存比较

内存比较,比较数组中元素的大小

int memcmp( const void *buf1, const void *buf2, size_t count );

这里的count是字节

返回值:

Return ValueRelationship of First count Bytes of buf1 and buf2
< 0buf1 less than buf2
0buf1 identical to buf2
> 0buf1 greater than buf2
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 3};

memcmp(arr1, arr2, 4);//看arr2前2个元素arr1有没有
memcmp(arr1, arr2, 20);
//如果字节超过了数组大小,会报警告,且打印出-1

十、memset 内存重置

数组更改每个字节为所需要的数

void *memset( void *dest, int c, size_t count );

需要更改成的数字,更改的字节数

返回值:返回数组首元素地址

int arr[] = {1, 2, 3, 4, 5};

memset(arr, 1, 20);//前20个字节全变为1
memset(arr, 0, 20);//前20个字节全变为0

十一、strerror 错误信息

打印错误码对应的错误信息

char *strerror( int errnum );

返回值:错误信息所对应字符串地址

char *p = strerror(1);
printf("%s\n", p);

解释:c语言调用失败的时候,会把错误码存在errno这个变量里面,是c语言内置的变量


以一个例子:

int main()
{
	FILE* pf = fopen("test.txt", "r");
    //打开文件函数,r是读取的意思
	//errno - 存储错误码的变量
	//strerror - 可以返回C语言内置的错误码对应的错误信息
	if (pf == NULL)
	{
		//printf("%s\n", strerror(errno));
        //打印 No such file or directory
        
		perror("测试");//打印+strerror,直接打印错误
        //会在自定义的信息后加上:和空格再加上错误信息
        //打印  测试: No such file or directory
	}
	else
	{
		printf("打开文件成功\n");
	}

	return 0;
}


点击全文阅读


本文链接:http://zhangshiyu.com/post/35839.html

字符串  函数  拷贝  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1