前言
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。
字符串常量适用于那些对它不做修改的字符串函数.
函数介绍及模拟
strlen函数
size_t strlen ( const char * str );
1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中’\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,是无符号的整数。
例:
#include <stdio.h> #include<string.h> int main() { const char*str1 = "abcdef"; //常量字符串后面默认带了个'\0' const char*str2 = "bbb"; if(strlen(str2)-strlen(str1)>0) // 6-3 { printf("str2>str1\n"); } else { printf("srt1>str2\n"); } return 0; }
模拟实现
size_t strlen ( const char * str );
#include<stdio.h> size_t my_strlen(const char* str) { const char* start = str; const char* end = str; while (*end != '\0') { end++; } return end - start; //指针相减等于两指针间的元素个数 } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
strcpy函数
char* strcpy(char * destination, const char * source );
注:前面的指针指向目标字符串,后面指针指向源字符串
1.源字符串必须以 ‘\0’ 结束。
2.将源指向的字符串复制到目标所指向的数组中,包括 ‘\0’ 字符(并在该点停止)。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变。(常量字符串不能修改,目标空间不能是常量字符串)
#include<stdio.h> #include<string.h> int main() { char arr[20] = "abcdef"; char* m = "fff"; strcpy(arr, m); printf("%s", arr); return 0; }
输出:fff
模拟实现
char* strcpy(char * destination, const char * source );
函数返回值为目标字符串起始地址
char* my_strcpy(char* dest, const char* src) { char* ret = dest; while (*dest++ = *src++); //后置加加,先解引用,再赋值,再加加,直到*dest=*src='\0',退出循环 return ret; } int main() { char arr1[20] = "abc"; char arr2[] = "hello hello"; printf("%s\n", my_strcpy(arr1, arr2)); return 0; }
输出:hello hello
strncpy函数
char * strncpy ( char * destination, const char * source, size_t num );
1.拷贝num个字符从源字符串到目标空间。
2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
我们可以看到,在拷贝完源字符串后又追加了3个0
模拟实现:
char* m_strncpy(char* destination, const char* source, size_t num) { char* p = destination; int i = 1; while (*destination = *source) { destination++; source++; i++; } destination++; num -= i; while (num--) { *destination++ = '\0'; } return p; } int main() { char arr[20] = "abcdef"; char* m = "abc"; printf("%s", strncpy(arr, m, 6)); return 0; }
strcat函数
char * strcat ( char * destination, const char * source );
1.将源字符串的内容追加到目标字符串(包括 ‘\0’ ),目标中的 ‘\0’ 字符被源的第一个字符覆盖。
2.源字符串必须以 ‘\0’ 结束。
3.目标空间必须有足够的大,能容纳下源字符串的内容。
4.目标空间必须可修改。
例:
#include<stdio.h> #include<string.h> int main() { char arr[20] = "abcdef"; char* m = "abc"; printf("%s", strcat(arr, m)); //函数返回值为目标字符串起始地址 return 0; }
输出:abcdefabc
模拟实现
char * strcat ( char * destination, const char * source );
#include<stdio.h> char* m_strcat(char* destination, const char* source) { char* p = destination; while (*destination++); destination--; //destination指向了\0后面的元素,所以-- while (*destination++ = *source++); return p; } int main() { char arr[20] = "abcdef"; char* m = "abc"; printf("%s", m_strcat(arr, m)); return 0; }
strncat函数
char * strncat ( char * destination, const char * source, size_t num );
1.将源的前 num 个字符追加到目标,外加一个终止空字符。
2.如果源中 C 字符串的长度小于 num,则仅复制到终止空字符之前的内容。
类似于前面的 strncpy 这里就不展开讲了。