1.strlen
自己写
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strlen(const int* str)
{
assert(str != NULL);
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
int arr[10] = { 9, 1, 2, 3, 4 };
printf("%d\n", my_strlen(arr));
return 0;
}
用const来保证源数组的值不被改变,assert保证指针不为空。
要注意strlen函数的返回值为无符号数,相减若小于0,则是大于0的。
2. strcpy字符串拷贝
1.要返回目的空间的起始地址
2.源地址不能被改变,要加上const
3.while的巧妙写法
3.strcat
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char arr1[11] = "hello \0XXXXXXXXX";
char arr2[] = "bit!";
printf("%s\n", strcat(arr1, arr2));
return 0;
}
会把'\0'也追加过去。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[21] = "hello ";
char arr2[] = "bit!";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
注意在判断dest是否达到'\0'的位置时要进行解引用操作。
4.strcmp
字符串比较的是字母的大小,而不是长度的大小。
err
right
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strcmp(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
{
return 0;//相等
}
arr1++;
arr2++;
}
if (*arr1 > *arr2)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
char* arr1 = "abcdef";
char* arr2 = "abb";
int ret = my_strcmp(arr1, arr2);
printf("ret = %d\n", ret);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strcmp(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
{
return 0;//相等
}
arr1++;
arr2++;
}
return (*arr1 - *arr2);
}
int main()
{
char* arr1 = "abcdef";
char* arr2 = "abb";
int ret = my_strcmp(arr1, arr2);
printf("ret = %d\n", ret);
return 0;
}
gcc底下写法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char arr1[4] = "abc";
char arr2[] = "hello bit!";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcpy的脾气不好,压根不关心目的字符数组的长度,就硬塞了进去。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char arr1[10] = "abcde";
char arr2[] = "hel";
strncpy(arr1, arr2, 6);
printf("%s\n", arr1);
return 0;
}
而strncpy就很乖了,如果要拷贝的长度比arr2的长度长,则追加'\0'。
strncat
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char arr1[30] = "abcef\0ddddddddd";
char arr2[] = "hello";
strncat(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
带着'\0'
超过了只放一个'\0'