c语言字符串库函数#include<string.h>
在头文件<string.h>中定义了两组字符串函数。第一组函数的名字以str开头;第二组函数的名字以mem开头。只有函数memmove对重叠对象间的拷贝进行了定义,而其他函数都未定义。比较类函数将其变量视为unsigned char类型的数组。
1 strcpy
#include <string.h>char* strcpy(char *str1, const char *str2);
把字符串str2(包括’\0’)拷贝到字符串str1当中,并返回一个指向str1的指针。
源字符串必须以’\0’结束
会将源字符串的’\0’拷贝到目标空间
目标空间必须可变
如果参数str1所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代
实例
#include <stdio.h>#include <string.h>int main(){char src[40];char dest[100];memset(dest, '\0', sizeof(dest));strcpy(src, "This is ");strcpy(dest, src);printf("最终的目标字符串: %s\n", dest);return(0);}
实现:
char * strcpy(char *dst,const char *str){if(dst==NULL||str==NULL){return NULL;}char * ret=dst;while(*str!='\0'){*dst++=*str++;}return ret;}
2 strncpy
char* strncpy(char* str1,const char* str2,size_t count)
把字符串str2中最多count个字符拷贝到字符串str1中,并返回str1。如果str2中少于count个字符,那么就用’\0’来填充,直到满足count个字符为止。
3 strcat
#include <string.h>char *strcat(char *str1, const char *str2);
把str2(包括’\0’)拷贝到str1的尾部(连接),并返回str1。其中终止原str1的’\0’被str2的第一个字符覆盖。注意:str1 与 str2 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。
实例
#include <stdio.h>#include <string.h>int main (){char src[50], dest[50];strcpy(src, "This is source");strcpy(dest, "This is destination");strcat(dest, src);printf("最终的目标字符串: |%s|", dest);return(0);}
实现:
#include <stdio.h>#include <assert.h>char* strcat(char *des, const char *src){assert(des != NULL && src != NULL); //断言两个字符串不为空char *temp = des; //指针temp指向des字符串内存地址while (*temp != '\0')//如果temp指针没有遇见'\0'temp++;//temp++while ((*temp++ = *src++) != '\0'); //实现循环拷贝,当src为'\0'时结束return des;//返回des值}
4 strncat
#include <string.h>char *strncat(char *str1, const char *str2, size_t count);
把str2中最多count个字符连接到str1的尾部,并以’\0’终止str1,返回str1。其中终止原str1的’\0’被str2的第一个字符覆盖。注意,最大拷贝字符数是count+1
5 strcmp
int strcmp (const char* str1,const char* str2)
功能:字符串比较
返回值:若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值
注意:
判断两个字符串大小1,ASII码 2,长度区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数
实例
#include <stdio.h>#include <string.h>int main (){char str1[15];char str2[15];int ret;strcpy(str1, "abcdef");strcpy(str2, "ABCDEF");ret = strcmp(str1, str2);if(ret < 0){printf("str1 小于 str2");}else if(ret > 0) {printf("str1 大于 str2");}else {printf("str1 等于 str2");}return(0);}结果:str1 大于 str2
实现:
int my_strcmp(char*arr1,char*arr2) {int i = 0;int size1,size2;size1=size2=0;for(i=0;arr[i];i++){size1++;}for(i=0;arr[i];i++){size2++;}if(size1 > size2){return 1;}else if(size1 < size2){return -1;}while (arr1[i] != '\0' && arr2[i] != '\0') {//只要任意一个字符串不结束,则继续执行if (arr1[i] > arr2[i]) {//遇见第一个不同字符比较其大小return 1;}else if (arr1[i] < arr2[i]) {return -1;}i++;}return 0;}
6 strstr
char* strstr(const char* str,const char* substr)
功能:检索子串在字符串中首次出现的位置
返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL
实例
#include <stdio.h>#include <string.h>int main(){const char haystack[20] = "RUNOOB";const char needle[10] = "NOOB";char *ret;ret = strstr(haystack, needle);printf("子字符串是: %s\n", ret);return(0);}结果:子字符串是:NOOB
实现:
int strStr(char * haystack, char * needle){int NL = strlen(needle);int HL = strlen(haystack);if(NL<1)return 0;int countN,countH;for(int i=0;i<HL;i++){if(HL-i<NL)return -1;countH =i;countN =0;while( haystack[countH++] == needle[countN++])if(countN == NL)return i;}return -1;}
示例1
1:string1 = ‘hello’
2:string2 = ‘ll’
3:输出 2
示例2
1:string1 =‘hello’
2:string2 =‘oo’
3:输出 -1
7 strchr
char* strchr(const char* str,char c)功能:查找字符串中第一次出现c的位置返回值:返回首次出现c的位置的指针,如果s中不存在c则返回NULL
实例
#include <stdio.h>#include <string.h>int main (){const char str[] = "";const char ch = '.';char *ret;ret = strchr(str, ch);printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);return(0);}结果:|.| 之后的字符串是 - |.|
实现
char *my_strchr(const char *s, int c){if(s == NULL){return NULL;}while(*s != '\0'){if(*s == (char)c ){return (char *)s;}s++;}return NULL;}int main(int argc, char *argv[]){const char str[]= "hello,this is a library";char ch = 'a';char *ret;ret = my_strchr(str,ch);printf ("%c后面的字符串是:%s\n",ch,ret);return 0;}结果:a后面的字符串是:a library
8 strtok
char *strtok(char *str, const char *sep)
sep参数是个字符串,定义了用作分隔符的字符集合第一个参数指定一个字符串,它包含了一个或者多个由sqp字符串中一个或者多个字符分割的标记第一次调用时将字符串首地址传进去,之后调用不用传地址,内部会有static函数保存指向地址分隔符不作为输出内容,只做分界符当strtok在参数s的字符串中发现到参数sep的分割字符时则会将该字符改为’\0’字符在第一次调用时,strtok必须赋予参数str字符串,往后的调用则将参数s设置成NULLstrtok会修改原字符串,所以必须放至栈上参数:str – 要被分解成一组小字符串的字符串。
sep – 包含分隔符的 C 字符串。
功能:根据分隔符将字符串分隔成一个个片段
返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL
说明:
实例:
#include <string.h>#include <stdio.h>int main () {char str[80] = "i don't want to say goodbye to you.";const char s[3] = "to";char *token;/* 获取第一个子字符串 */token = strtok(str, s);/* 继续获取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0);}
结果:i don’t want
say goodbye
you
实现:
#include <string.h> #include <stdio.h> char * my_strtok(char *str,char *demion);char *my_strtok(char *str,char *demion){static char *p_last = NULL;if(str == NULL && (str = p_last) == NULL){return NULL;} char *s = str;char *t= NULL;while(*s != '\0'){t= demion;while(*t != '\0'){if(*s == *t){p_last = s +1;if( s - str == NULL){str = p_last;break;}*s = '\0';return str;}t++;}s++;}return NULL;}int main(void) {char str[] = "liusen,lin,lll";char * result = NULL;result = my_strtok(str,",");printf("%s\n",result);result = my_strtok(NULL,",");printf("%s\n",result);return 0; }
9 atoi
int atoi(const char* str)实例:#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){int val;char str[20];strcpy(str, "98993489");val = atoi(str);printf("字符串值 = %s, 整型值 = %d\n", str, val);strcpy(str, "");val = atoi(str);printf("字符串值 = %s, 整型值 = %d\n", str, val);return(0);}**功能:将字符串转换成整型返回值:返回转换后的整型数。如果str不能转换成int或者str为空字符串,那么将返回0说明:ANSI C规范定义了 stof()、atoi()、atol()、strtod()、strtol()、strtoul()共6个可以将字符串转换为数字的函数,可以对比学习另外在C99/C++11规范中又新增了5个函数,分别是atoll()、strtof()、strtold()、strtoll()、strtoull()
memcpy
#include <string.h>
void *memcpy(void *to, const void *from, size_t count);
把from中的count个字符拷贝到to中。并返回to。
#include <stdio.h>#include <string.h>int main (){const char src[50] = "";char dest[50];memcpy(dest, src, strlen(src)+1);printf("dest = %s\n", dest);return(0);}结果:dest =
memmove
#include <string.h>
void *memmove(void *to, const void *from, size_t count);
功能与memcpy类似,不同之处在于,当发生对象重叠时,函数仍能正确执行。
#include <string.h>int main (){const char dest[] = "oldstring";const char src[] = "newstring";printf("Before memmove dest = %s, src = %s\n", dest, src);memmove(dest, src, 9);printf("After memmove dest = %s, src = %s\n", dest, src);return(0);}结果:Before memmove dest = oldstring, src = newstringAfter memmove dest = newstring, src = newstring
memcmp
#include <string.h>
int memcmp(const void *buf1, const void *buf2, size_t count);
比较buf1和buf2的前count个字符,返回值与strcmp的返回值相同。
C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
memchr
#include <string.h>
void *memchr(const void *buffer, int ch, size_t count);
C 库函数 void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
返回指向ch在buffer中第一次出现的位置指针,如果在buffer的前count个字符当中找不到匹配,则返回NULL。
memset
#include <string.h>
void *memset(void *buf, int ch, size_t count);
把buf中的前count个字符替换为ch,并返回buf。
如果觉得《C语言字符串库函数 #include <string.h>》对你有帮助,请点赞、收藏,并留下你的观点哦!