实现方式
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;
}
原文:https://blog.51cto.com/u_15100290/2718221