目录
一 . 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);}
运行结果:
可算完结了,如有疑问,欢迎探讨。