目录
1、函数介绍
1.1 strlen
size_t strlen ( const char * str );
- 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
- 参数指向的字符串必须要以 '\0' 结束
- 注意函数的返回值为size_t,是无符号的( 易错 )
- 头文件为#include <string.h>
- 学会strlen函数的模拟实现
#include <stdio.h>
#include <string.h>
int main()
{
char ch = 'a';
//"abcdef";//C语言没有字符串类型
//char arr[] = "abcdef";//6
//char arr[10] = { 'a', 'b', 'c', 'd', 'e', 'f'};//6
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };//随机
int len = strlen(arr);//string length
printf("%d\n", len);
return 0;
}
#include <stdio.h> #include <string.h> int main() { if (strlen("abc") - strlen("qwerty") > 0) { printf(">\n"); } else { printf("<=\n"); } return 0; }
输出结果:>
因为strlen函数返回类型是size_t(无符号整型的别称),strlen("abc") - strlen("qwerty")=-3
,-3被当成无符号整型的话,会被编译器当作一个很大很大的数(自然大于零),所以输出 >。改进方法如下(强制类型转换):
#include <stdio.h> #include <string.h> int main() { if ((int)strlen("abc") - (int)strlen("qwerty") > 0) { printf(">\n"); } else { printf("<=\n"); } return 0; }
模拟实现strlen:
法一:计数器
#include <stdio.h> #include <assert.h> size_t my_strlen(const char* str) { assert(str); int count = 0; while (*str) { count++; str++; } return count; } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
法二:递归
#include <stdio.h> #include <assert.h> size_t my_strlen(const char* str) { assert(str); if (*str == '\0') { return 0; } else { return 1 + my_strlen(str + 1); } } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
法三:指针-指针
#include <stdio.h> #include <assert.h> size_t my_strlen(const char* str) { assert(str); const char* eos = str; while (*eos++) { ; } return(eos - str - 1); } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
1.2 strcpy
char* strcpy(char * destination, const char * source );
- Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
- 学会模拟实现
#include <string.h> #include <stdio.h> int main() { //char arr1[4] = "x"; char* arr1 = "qwertyuiop";//arr1指向的是常量字符串,常量是不可修改的 char arr2[] = "abcdef"; //char arr2[10] = { 'a', 'b', 'c'}; strcpy(arr1, arr2); printf("%s\n", arr1); return 0; } //程序会崩溃
//strcpy函数返回的是目标空间的起始地址 //strcpy函数的返回类型的设置是为了实现链式访问
模拟实现strcpy:
#include <stdio.h> #include <assert.h> char* my_strcpy(char* dest, const char* src) { assert(src && dest); char* ret = dest; while(*dest+