【c语言】<string.h>头文件中所有函数详解

目录

一 . str开头

1. strcpy() 复制

2. strncpy() 复制

3. strcat() 合并

4. strncat() 合并

5. strcmp() 比较

6. strncmp() 比较

7. strchr() 查找

8. strrchr() 查找

9. strcspn() 查找

10. strspn() 查找

11. strpbrk() 查找

12. strstr() 查找

13. strlen() 计算长度

14. strerror() 错误码

15. strtok() 截取

二. mem开头

1. memcpy() 复制

2. memcmp() 比较

3. memchr() 查找

4. memset() 替换

5. memmove() 替换


头文件<string.h>中有两大类字符串函数。一类为str开头的函数,一类men开头的函数。men开头的函数,效率会更高一些。

参数中 size_t 是一种无符号整数类型,确保不会出现负数。


一 . str开头

1. strcpy() 复制

原型:char * strcpy(char *dest, char *src);

功能:src指向的字符 复制到dest中

返回:dest

#include<stdio.h>
#include<string.h>
int main(void)
{
	char desn[10];	
	char* source="hello world!";
	strcpy(desn,source);
	printf("源字符串  :%s\n",source);
	printf("目标字符串:%s\n",desn);
	return 0;
}

结果:

2. strncpy() 复制

原型:char * strncpy(char *dest, char *src, size_t  maxsize)

功能:src指向的字符 复制到dest中,并返回dest,限制最大字符串长度 maxsize。当src中少于maxsize时,使用‘\0’填充。其中size_t是无符号整型,保证maxsize始终为正数。

返回: dest

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * src="hello,world!";
   char dest[20];
   strncpy(dest, src, 20);
  
   printf("源字符串  :%s\n",src);
   printf("目标字符串:%s\n",dest);
   system("pause");
   return(0);
}

运行结果:

3. strcat() 合并

原型char *strcat(char *dest, const char *src)

功能:将字符串src 连接到dest的尾部。

返回: dest

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * src="world" ;
   char  dest[50] ="hello,"; /*目标字符串必须声明足够的长度,足够连接src字符串长度*/
  
   strcat(dest, src);
   printf("目标字符串:%s\n",dest);
   system("pause");
   return(0);
}

运行:

4. strncat() 合并

原型char *strcat(char *dest, const char *src,size_t maxsize)

功能:将字符串src 最多前maxsize个字符 连接到dest的尾部。src中必须有字符串结束符'\0'

返回: dest

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * src="world" ;
   char  dest[50] ="hello,"; /*目标字符串必须声明足够的长度,足够连接src字符串长度*/
  
   strncat(dest, src,3);
   printf("目标字符串:%s\n",dest);
   system("pause");
   return(0);
}

运行:

5. strcmp() 比较

原型int strcmp(const char *str1, const char *str2)

功能:比较字符串str1和str2

返回:  当str1<str2,返回值小于0

          当str1=str2,返回值等于0

          当str1>str2,返回值大于0

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str1  ="hello,world!" ;
   char * str2  ="hello,human!"; 
  
   int res= strcmp(str1, str2);
   if(res<0)
	 printf("str1小于str2");
   else if(res==0)
	 printf("str1等于str2");
   else
	 printf("str1大于str2");
    printf("\n");
   system("pause");
   return(0);
}

运行结果:

6. strncmp() 比较

原型int strncmp(const char *str1, const char *str2,size_t maxsize)

功能:字符串str1中至多maxsize个字符与字符串str2比较

返回:  当str1<str2,返回值小于0

          当str1=str2,返回值等于0

          当str1>str2,返回值大于0

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str1  ="hello,world!" ;
   char * str2  ="hello,human!"; 
  
   int res= strncmp(str1, str2,5);
   if(res<0)
	 printf("str1小于str2\n");
   else if(res==0)
	 printf("str1等于str2\n");
   else
	 printf("str1大于str2\n");
   printf("\n");
   system("pause");
   return(0);
}

运行结果:

发现和strcmp()中的结果不一样,是因为strncmp(str1, str2,5)中,只比较了前5个字符。前5个字符都是hello,所以相等。

7. strchr() 查找

原型char *strchr(const char * src, int c)

功能:查找字符c在src中的第一次出现的位置

返回:  字符c在src中的第一次出现位置的指针

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str  ="hello,world!" ;
  
   char * pos;
  
   pos= strchr(str, 'o');
   
   printf("\n 字符第一次出现的位置为第%d个(从0开始),内存地址为:0x%x\n", pos-str,pos );

   system("pause");
   return(0);
}

运行结果:

8. strrchr() 查找

原型char * strrchr(const char * src, int c)

功能:查找字符c在src中的最后一次出现的位置

返回:  字符c在src中的最后一次出现位置的指针

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str  ="hello,world!" ;
   char * pos;

   pos= strrchr(str, 'o');
   printf("\n 字符最后一次出现的位置为第%d个(从0开始),内存地址为:0x%x\n", pos-str,pos );

   system("pause");
   return(0);
}

运行结果:

9. strcspn() 查找

原型:size_t strcspn(const char * str1, const char * str2)

功能:返回字符串 str1 中包含str2中字符的前缀的长度。或者可以理解为字符串 str1 中第一个在字符串 str2 中出现的字符下标 。直接看代码和运行结果,看完就明白了。

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str1  ="world!" ;
   char * str2="jbgar"; 

   int len;
   len = strcspn(str1, str2);/*world中r在ar中出现了,它的下标是2*/

   printf("\nstr1中找到第一个在str2中出现的字母,它的下标为:%d\n", len);

   system("pause");
   return(0);
}

运行结果:

10. strspn() 查找

原型:size_t strspn(const char * str1, const char * str2)

功能:返回字符串 str1 中不包含str2中字符的前缀的长度。或者可以理解为 查找字符串 str1 中第一个没有在字符串 str2 中出现的字符下标 。直接看代码和运行结果,看完就明白了。这个容易和strcspn()函数搞反,得格外注意。

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str1  ="world!" ;
   char * str2="dewor"; 

   int len;
   len = strspn(str1, str2);/*world中l在是第一个没有在dewor中出现,它的下标是3*/

   printf("\nstr1中找到第一个没有在str2中出现的字母,它的下标为:%d\n", len);

   system("pause");
   return(0);
}

运行结果:

11. strpbrk() 查找

原型char  *  strpbrk(const char * str1, const char * str2)

功能:查找str2的任意字符在str1中第一次出现的位置,并返回指向这个位置的指针

返回:  字符指针

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str1  ="world!" ;
   char * str2="glar"; 
   char * pos;

   pos = strpbrk(str1, str2);/*glar中的r是第一个在world中出现,将返回r的位置,
							 虽然glar中的l在world中也出现,但是它不是第一个在world中出现的*/

   printf("\nstr2的字符在str1中第一个出现的字母是%c,它在str1的下标为%d\n", *pos,pos-str1);

   system("pause");
   return(0);
}

运行结果:

12. strstr() 查找

原型char  *  strstr(const char * str1, const char * str2)

功能:查找str2在在str1中第一次出现的位置,并返回指向这个位置的指针

返回:  字符指针

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str1  ="wohello,world!" ;
   char * str2="wor"; 
   char * pos;

   pos = strstr(str1, str2);

   printf("\n\"wor\"在\"wohello,world\"中第一个出现的位置下标为%d\n", pos-str1);

   system("pause");
   return(0);
}

运行结果:

13. strlen() 计算长度

原型size_t  strstr(const char * str)

功能:返回str的长度

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * str1  ="hello,world!" ;
  
   int len = strlen(str1);

   printf("\n\str1的长度:%d\n", len);

   system("pause");
   return(0);
}

运行结果:

14. strerror() 错误码

原型char * strerror(int n)

功能:传入不同的错误码时 返回对应的错误字符串。这个函数很有意思哦。

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	
   
   printf("\n \040 0 :%s \n", strerror(0)); /* \040是空格的转义字符 */
   printf("\n \040 1 :%s \n", strerror(1));
   printf("\n \040 2 :%s \n", strerror(2));
   printf("\n \040 3 :%s \n", strerror(3));
   printf("\n \040 4 :%s \n", strerror(4));
   printf("\n \040 5 :%s \n", strerror(5));
   printf("\n \040 6 :%s \n", strerror(6));
   printf("\n \040 -1 :%s \n", strerror(-1));
   system("pause");

   return(0);
}

 运行结果:

15. strtok() 截取

原型char * strtok(char* str1,const char* str2)

功能:使用str2,对str1字符串进行分隔截取,返回截取的部分字符串

示例:

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

int main()
{
   char  str [] ="hello@world@coffee@tea!" ;
   char * c="@" ;
 
  
   printf("\n第一个:%s\n", strtok(str,c));
   printf("\n第二个:%s\n", strtok(NULL,c));
   printf("\n第三个:%s\n", strtok(NULL,c));
   printf("\n第四个:%s\n", strtok(NULL,c));

   printf("\n再重新开始:%s\n", strtok(str,c));
   system("pause");
   return(0);
}

运行结果:


二. mem开头

men开头的函数,主要目的是提供一个高效的函数接口。

1. memcpy() 复制

原型void *  memcpy( char * str1, const char * str2 ,int n)

功能:将字符串str2中的n个字符拷贝到str1中;

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	
   char  str1[13]  ;
   char * str2="hello,world!" ;
  
   memcpy(str1,str2,13);
	
   printf("\n\str1中字符为:%s\n", str1);

   system("pause");
   return(0);
}

运行结果:

2. memcmp() 比较

原型int  memcmp(const char * str1, const char * str2 ,int n)

功能:str1中的前n个字符和str2中的值进行比较。

返回:

        当str1<str2时,返回值<0

        当str1=bstr2时,返回值=0

        当str1>str2时,返回值>0

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	
   char * str1="hello,world!" ;
   char * str2="helle" ;
   char * resstr;
   int res=memcmp(str1,str2,5);
   if(res<0)
	  resstr="小于";
   else if(res=0)
	   resstr="等于";
   else 
	   resstr="大于";
   printf("\n\str1的前5个字符%sstr2的字符\n", resstr);

   system("pause");
   return(0);
}

运行结果:

3. memchr() 查找

原型char * memchr(const char * str, char  c ,int n)

功能:在str中前n个字符中查找 c的位置,返回找到的位置的指针,如果找不到返回NULL

示例:

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

int main()
{
   char * str="hello,world!" ;
   char  c=',' ;
   char * pos;
   pos=(char*) memchr(str,c,10);
  
   printf("\n\",\"在\"hello,world\"的下标位置为:%d\n", pos-str);

   system("pause");
   return(0);
}

运行结果:

4. memset() 替换

原型void * memset( void * ptr, int  value ,size_t n)

功能:此函数初始化函数,将某一块内存(参数ptr)中的内容全部设置为指定的值 value

         将ptr中的前n个数据替换为value,并返回ptr,

示例1:

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

int main()
{
   char  str []="hello,world!" ;
   char  c='w' ;
 
   memset(str,c,5);
   printf("\n\str中字符串:%s\n", str);

   system("pause");
   return(0);
}

运行结果:

示例2:

结构变量初始化,将结构中的变量用value初始化。

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

typedef struct manager {
	int iArr [12];
	float fArr [5];
	char ch; //整型int赋值给char,只要数组在-128到127之间就没问题
} Manager;

//打印manager中的值
 void  printManager(Manager manager)
{
	int i=0;
	puts("iArr值:");
	for(; i<12; i++)   //打印数组iArr的所有元素
		printf("第%d个: %d\n",i+1, manager.iArr[i]);
	puts("\nmanager->fArr值:");
	for(i=0; i<5; i++) //打印数组fArr的所有元素
		printf("第%d个: %f\n",i+1, manager.fArr[i]);
	puts("\nmanager->ch值:");
	printf("%c\n", manager.ch);
}

void memsetTest()
{
	Manager  manager ;
		
	printf("使用65初始化\n");
	memset(&manager,65,sizeof(manager));
	printManager(manager);

	printf("\n使用0初始化\n");
	memset(&manager,0,sizeof(manager));
	printManager(manager);

}

int main()
{

    memsetTest();
	getchar();
	return 0;

}

返回结果:

5. memmove() 替换

原型void *  memmove( char * str1, const char * str2 ,int n)

功能:将s中的前n个字符替换为c,并返回s,功能和memcpy一样,但是可以解决linux下memcpy因为地址重叠而造成替换失败的问题。算是对memcpy的一个升级。在windows系统中没有这个问题。

示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   char * src="hello,world!";
   char dest[20];
   memmove(dest, src, 20);
  
   printf("源字符串  :%s\n",src);
   printf("目标字符串:%s\n",dest);
   system("pause");
   return(0);
}

运行结果:

可算完结了,如有疑问,欢迎探讨。

  • 33
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值