实现方式
int my_strlen(const char a[]) { int i = 0, count = 0; while (a[i] != '\0') { count++; i++; } return count; } int main() { char a[] = "abcxccxdef"; int ret=my_strlen(a); printf("%d", ret); }
例如:我们来看一下strlen的另一个特点,它的返回值是size-t,是无符号整型,但是我们自己写的是返回的是整型。
长度不受限制的字符串函数 1.字符串拷贝函数 2.会拷贝源字符串的‘\0’;也就是会覆盖目标字符串的内容。
实现方式
char* my_strcpy(char* a, const char* b) { char* ret = a; //判断b数组起始位置不为‘\0’; while (*b != '\0') { *a = *b; a++; b++; } //*b 这时指向‘\0’,把它拷贝到a中。 *a = *b; return ret; } int main() { char a[10] = "abcdef"; char b[] = "bcdef"; char* ret=my_strcpy(a, b); printf("%s", ret); return 0; }
实现方式
char * my_strcat(char* a, const char* b) { char* ret = a; //遍历数组a,使得a指向‘\0’; while (*a != '\0') { *a++; } //把数组b中的元素追加到a中,此时的a已经指向'\0.' while (*b != '\0') { *a = *b; *a++; *b++; } //此时的b为'\0',把它也追加到a中 *a = *b; return ret; } int main() { char a[20] = "abcdef"; char b[] = "wxl"; char* ret=my_strcat(a, b); printf("%s", ret); return 0; }
实现方式
int my_strcmp(const char *a, const char *b) { while (*a == *b) { if (*a == '\0') { //相等 return 0; } a++; //相等的情况下继续比较下一对字符。 b++; } if (*a > *b) { //大于 return 1; } else return -1; //小于 } int main() { char a[] = "abcdef"; char b[] = "abhhhh"; int ret = my_strcmp(a, b); printf("%d", ret); return 0; }
int main() { char a[10] = "hhahadd"; char b[] = "abcdefghighik"; strncpy(a, b, 5); printf("%s", a); }
注意点第二项:
int main() { char arr1[30] = "abcdef"; char arr2[] = "ghijk"; strncat(arr1, arr2, 3); printf("%s", arr1); }
int main() { char a[] = "abcdef"; char b[] = "abcwef"; int ret = strncmp(a, b, 4); printf("%d\n", ret); }
实现方式
char* my_strstr(const char* a, const char* b) { char* p1 = (char *)a; char* p2 = (char * ) b; char* cur = (char * )a; while (*cur != '\0') { p1 = cur; p2 = (char * )a; while ((*p1 != '\0') && (*p2 != '\0') && (*p1 == *p2)) { p1++; p2++; } cur++; if(*p1='\0'){ //当p1等于‘\0’时,直接终止。 return NULL; if (*p2 == '\0') { return cur; //当p2为'\0'的时候,直接返回cur指向的地址,进行打印; } } return NULL; //没找到 } int main() { char a[] = "abbbcefg"; char b[] = "bbc"; char* ret = my_strstr(a, b); if (ret == NULL) { printf("字串不存在"); } else { printf("%s", ret); } }
小写转大写
#include <ctype.h> int main() { int i = 0; char a[] = "I Am a Student"; while (a[i] != '\0') { if (isupper( a[i])) { a[i] = tolower(a[i]); } i++; } return 0; }
实现方式
void* my_memcpy(void* dest, const void* str, size_t num) { void* ret =dest; while (num--) { *(char*) dest = *(char* )str; ++(char *)dest; ++(char *)str; } return ret; } int main() { int a[] = { 1,2,3,4,5,6 }; int b[10] = { 0 }; my_memcpy(a, b, sizeof(a)); return 0; }
实现方式
void* my_memcpy(void* dest, const void* str, size_t num) { void * ret = dest; if(dest<str){ //从前往后 while (num--) { *(char*)dest = *(char*)str; ++(char *)dest; ++(char *)str; } } else { //从后-前 while (num--) { *((char *)dest + num) = *((char *)str + num); } } return ret; } int main() { int a[] = { 1,2,3,4,5,6,7,8,9,10 }; my_memcpy(a+3, a, 20); return 0; }
int main() { char arr1[10] = ""; memset(arr1, '#', 10); //把arr1重置#号,数量为10个 printf("%s", arr1); }
int main() { int arr1[] = { 1,2,3,4,5,6 }; int arr2[] = { 1,2,5,6,4,7 }; int ret = memcmp(arr1, arr2, 8); //比较前八个字节,也就是两个整型,1和2比较 printf("%d", ret); return 0; }