strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
#include<stdio.h>
#include<assert.h>
int my_strlen(char *p)
{
assert(p != NULL);
int count = 0;
while (*p)
{
count++;
p++;
}
return count;
}
int my_strlen2(char *p)
{
assert(p != NULL);
if (*p == '\0')
return 0;
else
return 1 + my_strlen2(p+1);
}
int main()
{
char *p = "abcdef";//文本区、双引号后面默认加‘\0’{}后面得自己加'\0'
char p2[] = "abcd";//栈
printf("%d\n",my_strlen(p2));
printf("%d\n",my_strlen2(p));
system("pause");
}
strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*
#include<stdio.h>
#include<assert.h>
char* MY_strcpy(char* dest, const char* src)
{
char * ret;
assert(dest&&src);
ret = dest;
while (*dest++ = *src++)
{
;
}
/*while (*src)
{
*dest = *src;
dest++;
src++;
}*/
return ret;
}
int main()
{
char arr[20] = "0";
char avg[20] = "good job";
MY_strcpy(arr, avg);
printf("%s\n", avg);
printf("%s\n", arr);
system("pause");
return 0;
}
strcat把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
#include<stdio.h>
#include<assert.h>
char* my_strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest);
assert(src);
//1. 找目标的'\0'
while (*dest)
{
dest++;
}
//2. 源拷贝到目标
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = "Good";
char avg[10] = "game!!!";
my_strcat(arr, avg);
printf("%s\n", arr);
system("pause");
return 0;
}
strchr是计算机编程语言的一个函数,原型为extern char *strchr(const char *s,char c),可以查找字符串s中首次出现字符c的位置。
#include<stdio.h>
char * my_strchr(char * arr, char ch)
{
while (*arr != '\0')
{
if (*arr == ch)
{
return (char *)arr;
}
arr++;
}
return NULL;
}
int main()
{
char *arr = "abcde";
char *ret = my_strchr(arr, 'd');
printf("%s\n", ret);
system("pause");
return 0;
}
matlab中函数,strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false。
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char *arr1, const char *arr2)
{
char *s1 = arr1;
char *s2 = arr2;
assert(arr1&&arr2);
while (*s1 && *s2)
{
if (*s1 == *s2)
{
s1++;
s2++;
}
else if (*s1 > *s2)
return 1;
else
return -1;
}
return 0;
}
int main()
{
char *arr1 = "goodgame";
char *arr2 = "goodgame";
char *arr3 = "goodjob";
int ret1 = my_strcmp(arr1, arr2);
int ret2 = my_strcmp(arr1, arr3);
printf("%d\n", ret1);
printf("%d\n", ret2);
system("pause");
return 0;
}
///*字符串比较函数,一般形式为strcmp(字符串1,字符串2)。
//比较规则:
//对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。
//如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
//如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。
memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
//原型:extern void *memcpy(void *dest, void *src, unsigned int count);
//用法:#include <string.h>
//功能:由src所指内存区域复制count个字节到dest所指内存区域。
//说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针
//1、memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制
//拷贝的字节数;
//函数原型:void *memcpy(void *dest, void *src, unsigned int count);
//用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,
//但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,这样在指针加的时候才会保证每次加一个字节
#include<stdio.h>
#include<assert.h>
void *my_memcpy(void *dest, void *arr, size_t size)
{
char *ret = dest;
assert(dest != NULL);
assert(arr != NULL);
while (size-- )
{
*(char *)dest = *(char *)arr;
++(char *)dest;
++(char *)arr;
}
return ret;
}
int main()
{
char arr[] = "goodjob!!!";
char dest[20] = { 0 };
char *ret =my_memcpy(dest, arr, strlen(arr));//第三个参数是需要拷贝的字节数
printf("%s\n", ret);
printf("%d", strlen(arr));
system("pause");
return 0;
}
memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
#include<stdio.h>
#include<assert.h>
void* my_memmove(void *dest, const void*src, size_t count)
{
void *ret = dest;
assert(dest != NULL);
assert(src != NULL);
if(dest<src)
{
//前->后
while(count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
}
}
else
{
dest = (char *)dest + count - 1;
src = (char *)src + count - 1;
//后->前
while(count--)
{
*(char *)dest = *(char*)src;
dest = (char *)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
char arr2[] = "123456789";
char *ret = (char *)memmove(arr2+3, arr2+2, 4);
printf("%s\n", ret);
printf("%s\n", arr2);
system("pause");
return 0;