前言
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在
常量字符串 中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数.
1.求字符串长度
strlen
1.1 strlen
size_t strlen ( const char * str );
字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为size_t,是无符号的( 易错 )
学会strlen函数的模拟实现
strlen是一个库函数,是用来求字符串的长度的,len1和len2的值是一样的,因为str是char*类型的指针,指向的是a的地址。
#define _CRT_SECURE_NO_WARNINGS 1 #include <string.h> #include<stdio.h> int main() { const char* str = "abcdef"; size_t len1 = strlen("abcdef"); size_t len2 = strlen(str); printf("%d\n", len1); printf("%d\n", len2); return 0; }
需要注意的是strlen遇到\0就会停止统计,假设我们在c的后面放上\0,那么答案就是3.
我们需要注意的是strlen的返回值是size_t,是无符号数,所以-3被认定为无符号数,最高位的1被认为是正数,所以结果是>=0。
#define _CRT_SECURE_NO_WARNINGS 1 #include <string.h> #include<stdio.h> int main() { //两个无符号数相减得到的还是无符号数 // 3 - 6 //-3 //10000000000000000000000000000011 //11111111111111111111111111111100 //11111111111111111111111111111101 // if (strlen("abc") - strlen("abcdef") > 0) printf(">=\n"); else printf("<\n"); return 0; }
2.长度不受限制的字符串函数
strcpy
strcat
strcmp
2.1 strcpy
char* strcpy(char * destination, const char * source );
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
学会模拟实现。
strcpy这个库函数的作用是 将源指向的 C 字符串复制到目标指向的数组中,包括终止的 null 字符(并在该点停止)。
#define _CRT_SECURE_NO_WARNINGS 1 #include <string.h> #include<stdio.h> int main() { char arr1[20] = {0}; char arr2[] = "HELLO"; strcpy(arr1, arr2); printf("%s\n", arr1); return 0; }
如果我们这样使用strcpy的话,就会出错,因为p里面存放的是常量字符串,是不能被修改的。
#define _CRT_SECURE_NO_WARNINGS 1 #include <string.h> #include<stdio.h> int main() { char* p = "abcdefghi"; char arr2[] = "HELLO"; strcpy(p, arr2);//err printf("%s\n", p); return 0; }
2.2 strcat
char * strcat ( char * destination, const char * source );
源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
strcat这个库函数的参数跟strcpy是一样的。这个库函数运行的第一步应该是找到目标字符串的末尾,也就是\0,找到之后再把源字符串的内容追加到目标字符串里面去,并且源字符串的\0也会追加过去。
#define _CRT_SECURE_NO_WARNINGS 1 #include <string.h> #include<stdio.h> int main() { char arr1[20] = "abc"; char arr2[] = "def"; strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
2.3 strcmp
int strcmp ( const char * str1, const char * str2 );
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
strcmp比较的不是长度,而是对应位置上的字符的大小(ASCII码值)。
如果第一个字符大小相同则进行后面的比较。
这里我们需要重要的是strcmp的返回值是int类型,两个参数都是char*的指针,是不能被改变的。
strcmp规定是:
目标字符串>源字符串则返回>0;
目标字符串<源字符串则返回<0;
目标字符串=源字符串则返回=0;
但是在vs编译器上分别是1,-1,0。在各个编译器上的返回值是不一样的,满足条件即可。
#define _CRT_SECURE_NO_WARNINGS 1 #include <string.h> #include<stdio.h> int main() { char arr1[] = "abc"; char arr2[] = "abq"; int ret = strcmp(arr1, arr2); printf("%d", ret); return 0; }
3.长度受限制的字符串函数介绍
strncpy
strncat
strncmp
3.1strncpy
char * strncpy ( char * destination, const char * source, size_t num );
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
strncpy和strcpy的前两个参数是一样的,只是返回值是char*的指针,返回的是目标字符串。并且strncpy还多了一个参数size_t num,下面这个代码的意思就是将源字符串的前三个字符拷贝到目标字符数组里面去。
#define _CRT_SECURE_NO_WARNINGS 1 #include <string.h> #include<stdio.h> int main() { char arr1[20] = { 0 }; char arr2[] = "abcdefghi"; strncpy(arr1, arr2, 3); printf("%s\n", arr1); return 0; }