strlen
size_ t strlen ( const char * str );
字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0' )
参数指向的字符串必须要以'\0'结束,char arr[]={'a','b','c','d'};这种数组不行,这种数组最后没有'\0',int len=strlen(arr);得到的是随机值。注意函数的返回值为size_ t,size_t 就是unsigned int
strcpy
char* strcpy(char * destination,const char * source );
源字符串必须以'\0'结束。拷贝的位置是从目标地址的第一个元素开始会将源字符串中的'\0'拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串。目标空间必须可变,不能是const
strncpy
char *strncpy( char *strDest, const char *strSource, size_ t count );
第三个参数是要拷贝的字符个数,当源字符串不足时,补'\0',但是要注意count是几就拷贝几个,不会在拷贝完后追加'\0'
char arr1[30]="abcdxxxxxxxxxxx",arr2[]="ef"; strncpy(arr1,arr2,6);//arr2不足6位,拷贝的时候在arr1补0,arr2还是ef,后面也只有一个'\0'
strcat
char * strcat ( char * destination, const char * source );
源字符串必须以'\0'结束。目标空间必须有足够的大,能容纳下源字符串的内容。目标空间必须可修改。字符串自己不能给自己追加
源字符串的'\0'也追加到目标空间了,并且是从目标空间的'\0'开始,'\0'要被覆盖掉
strncat
char *strncat( char *strDest, const char *strSource, size_ t count );
count为追加个数,追加完后会在后面补'\0',当源字符串个数小于count时,多余的部分不追加
char arr1[30]="abcdefxxx\0xxxxxxxxx",arr2[]="jk"; strncat(arr1,arr2,8);
strcmp
int strcmp( const char *stringl, const char *string2 );
比的是字符的ascall码的大小,两个字符串第一个字符相等就比较第二个,以此类推
string1小于string2返回值<0,string1等于string2返回值=0,string1大于string2返回值>0,
strncmp
int strncmp ( const char * str1,const char * str2,size. _t mum );
基本都和strcmp一样,只是mum是比较的字符个数
strstr
char *strstr (const char *,const char *);
查找字符串函数,找到了返回查找字符串在目标中的首地址,没找到返回NULL指针
strtok
char * strtok ( char * str,const char * sep ) ;
char str[]="10086@qq.com"; char sep[]="@."; char *p; p=strtok(str,sep);printf("%s",p);//10086 p=strtok(NULL,sep);printf("%s",p);//qq p=strtok(NULL,sep);printf("%s",p);//com
sep参数是个字符串,定义了用作分隔符的字符集合,例如上例的'@'和'.',也叫标记
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的一个标记时,将其用\0替换,返回一个指向这个标记的指针。
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串时,一般都要用临时拷贝的内容进行切分。
strtok函数在找str中第一个标记时,第一个参数设置为str的首元素地址,在找到第一个标记时,strtok函数将保存它在字符串中的位置。
strtok函数在找str中除第一个标记以外的标记时,第一个参数设为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回NULL指针。
strerror
char*strerror ( int errnum ) ;
返回错误码,所对应的错误信息。errno是一个全局的错误码的变量,
当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中
FILE* pf = fopen("test .txt", "r");//打开文件 if (pf == NULL) { printf("%s\n", strerror(errno)); } else printf("open file success\n");
字符分类函数
还有两个字符转换函数:
int tolower ( int c );//将大写转换为小写
int toupper ( int c );//将小写转换为大写
char arr[]="abcdefjk" int i = 0; while (arr[i]) { if (islower(arr[i]))//是否小写 arr[i] = toupper(arr[i]);//转化为大写 i++; } printf("%s\n", arr);
通过循环就可以实现字符串大小写的转换
相关代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <errno.h> int my_strlen(const char a[]) { int count=0; while (*a) { count++; a++; } return count; } char* my_strcpy(char* aim, const char* str) { char *a = aim; while (*aim++ = *str++); return a; } char* my_strcat(char* aim, const char* str) { char *a = aim; while (*aim)aim++; while (*aim++ = *str++); return a; } int my_strcmp(const char* str1, const char* str2) { while (*str1 == *str2) { if (*str1 == '\0') { return 0; } str1++; str2++; } return (*str1 - *str2); } char* my_strncpy(char* aim,const char* str,int count) { char* a = aim; while (count && (*aim++ = *str++)) count--; if (count) while (--count) *aim++ = '\0'; return a; } char * my_strncat(char * aim,const char * str,int count) { char *a = aim; while (*aim++) aim--; while (count--) if (!(*aim++ = *str++)) return(a); *aim = '\0'; return a; } int main() { char arr1[30] = "abcdef",arr[30]="abcdef";//两个数组,在不同空间,只是内容一样 char *p = "abcd";//这是常量字符串 char *q = "abcd";//p,q指向的是同一块空间,与数组不同 char arr2[] = { 'a','b','c','e','f' }; char arr3[] = { "jk" }; int a =strlen(arr1); int b = strlen(arr2); char *p1 = "ab", *p2 = "cd"; char *res; char str[] = "10086@qq.com"; char sep[] = "@."; printf("%d\n", a);//6 printf("%d\n", b);//随机值 if (strlen("abcd") - strlen("abcdef")>0)//这里需要注意,strlen返回值是无符号整型, //4-6=-2,-2=10000010,10000010无符号是130 printf("1\n");//所以打印1 else printf("2\n"); //arr1 = arr3;这种直接将地址赋值给地址的拷贝方式是错误的,字符串之间的拷贝用strcpy函数 //strcpy(arr1, arr2);arr2没有\0,会向后越界访问 //strcpy(p, arr3);p是常量字符串,不能修改 strcpy(arr1, arr3); printf("%s\n", arr1);//jk,这里没有cdef,因为将arr3的\0也拷贝了 strncpy(arr1, p1, 6);//不足6位补0 printf("%s\n", arr1);//ab, strcat(arr, arr3); printf("%s\n", arr);//abcdefjk,这里也可以证明arr和arr1在不同空间,如是在同一块空间应是打印jkjk strncat(arr1, arr3,8);//在追加完后,会在后面补0,arr3不足8个,超过的部分不追加 printf("%s\n", arr);//abcdefjkjk printf("%d %d %d\n",strcmp(p, q), strcmp(p1, p2), strcmp(p2, p1)); res=strstr(p, p1);//查找字符串函数,找到了返回查找字符串在p中的首地址,没找到返回NULL指针 if (res == NULL)printf("没找到"); else printf("%s\n", res);//abcd for(res=strtok(str, sep);res!=NULL; res = strtok(NULL, sep)) printf("%s\n", res); //errno是一个全局的错误码的变量 //当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中 FILE* pf = fopen("test .txt", "r");//打开文件 if (pf == NULL) { printf("%s\n", strerror(errno)); } else printf("open file success\n"); int i = 0; while (arr[i]) { if (islower(arr[i])) arr[i] = toupper(arr[i]); i++; } printf("%s\n", arr); return 0; }