#include<stdio.h>
#include<assert.h>
void* mymemmove(void* a, const void* b, int n) {
assert(a != NULL && b != NULL && n != 0);
int i = 0;
char* a1 = (char*)a;
const char* b1 = (const char*)b;
if (b1 <= a1 && a1 <= b1 + n) {//当被a1的内存首地址在b1到b1之间时,cpy会发生错误,此时倒着cpy就可以解决问题
while (n > 0) {
a1[n - 1] = b1[n - 1];
n--;
}
return a;
}
while (i < n) {
a1[i] = b1[i];
i++;
}
return a;
}
int main() {
char a[] = "maonlnpeng shizhuhhhhhhh";
mymemmove(a + 17, a + 14, 7);
puts(a);
return 0;
}
//memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的.
//如果源空间和目标空间出现重叠,就得使用memmove函数处理.
//#include<stdio.h>
//#include<assert.h>
函数memcpy从b的位置开始向后复制n个字节的数据到a的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果b和a有任何的重叠,复制的结果都是未定义的.
//typedef struct test {
// char name[1024];
// int num;
//}test;
//void* mymemcpy(void* a,const void* b,int n){
// assert(a != NULL && b != NULL&&n!=0);
// int i = 0;
// char* a1 = (char*)a;
// const char* b1 = (const char*)b;
// while (i<n){
// a1[i] = b1[i];
// i++;
// }
//}
//int main() {
// test a = { "sca",100 };
// test b = { "bf",0 };
// mymemcpy(&a,&b,1);
// printf("%s %d", a.name, a.num);
// return 0;
//}
//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//char* mystrstr(const char* a, const char* b) {
// assert(a != NULL && b != NULL);
// const char* black = a;
// while (*black!='\0'){
// const char* red = black;
// const char* sub = b;
// while (*red==*sub && *red!='\0'&& *sub!='\0'){
// red++, sub++;
// }
// if (*sub == '\0') {
// return black;
// }
// if (*red != *sub) {//这个条件可以省略
// black++;
// }
// }
// return NULL;//第三种情况*red=='\0'&& *sub!='\0'
//}
//int main() {
// char a[] = "mvadomlp shizhu";
// char b[] = "mlp";
// printf("%s", mystrstr(a, b));
// //printf("%c", *strstr(a, b));
// return 0;
//}
值得注意的是文档上的memcpy不能处理内存重叠情况,但在很多编译器上处理过后memcpy==memmove.
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdio.h>
#include<assert.h>
//char* mystrcat(char* a,const char* b) {
// assert(a != NULL&&b!=NULL);//assert是一个宏,条件不成立时直接使程序崩溃,成立则无事发生用于工作中判断异常请求等
// int n = 0;
// while (a[n]!='\0'){
// n++;
// }
// int i = 0;
// while (b[i]!='\0'){
// i++;
// }
// for (int j = 0; j < i; j++,n++) {
// a[n] = b[j];
// }
// return a;
//}
//int mystrcmp(const char* a, const char* b) {
// assert(a != NULL && b != NULL);
// int i = 0, j = 0;
// while (a[i]!='\0'&&b[j]!='\0'){
// if (a[i] != b[j]) {
// return a[i] > b[i]?1:-1;
// }
// i++, j++;
// }
// if (a[i] != '\0') {
// return 1;
// }
// else if (b[j] != '\0') {
// return -1;
// }
// else
// return 0;
//}
//char* mystrcpy(char* a, const char* b) {
// assert(a != NULL && b != NULL);
// int i = 0;
// while (b[i]!='\0') {
// a[i] = b[i];
// i++;
// }
// a[i] = b[i];
// return a;
//}
int mystrlen(const char* a) {
assert(a != NULL);
int i = 0;
while (a[i]!='\0'){
i++;
}
return i;
}
int main(){
/*char a[1024] = "abcdef";
char b[] = "ghijkl";
printf("%s ", mystrcat(a, b));*/
//char a[1024] = "abcdef";
//char b[] = "abcdefg";
//printf("%d ", mystrcmp(a, b));
//printf("%d ", strcmp(a, b));
/*char a[1024] = "a";
char b[1024] = "abcdefgasjdkf";
printf("%s ",mystrcpy(a, b));*/
char a[1024] = "abcdef";
printf("%d ", mystrlen(a));
return 0;
}
strtok有使用缺陷和笔试也少考,在这里不做过多了解.
#include<assert.h>
#include<stdio.h>
int mystrncmp(const char* a, const char* b,int n) {
assert(a != NULL && b != NULL && n != 0);
int i = 0;
while (a[i]!='\0'&&b[i]!='\0'&&i<n){
if (a[i] != b[i]) {
return a[i] > b[i] ? 1 : -1;
}
i++;
}
if (a[i] != '\0') {
return 1;
}
if (b[i] != '\0') {
return -1;
}
else
return 0;
}
int main() {
char a[1024] = "afs";
char b[] = "afsf";
printf("%d",mystrncmp(a,b,9));
return 0;
}
//#include<assert.h>
//#include<stdio.h>
//char* mystrncat(char* a,const char* b,int n) {
// assert(a != NULL && b != NULL && n != 0);
// int i = 0;
// while (a[i]!='\0'){
// i++;
// }
// int j = 0;
// while (j<n){
// a[i] = b[j];
// j++,i++;
// }
// return a;
//}
//int main() {
// char a[1024] = "mm";
// char b[] = "afas";
// printf("%s",mystrncat(a,b,9));
// return 0;
//}
//#include<assert.h>
//#include<stdio.h>
//typedef unsigned long size_t;//size_t在标准库用来表示一个整数,一般是八个字节,不过使用他容易溢出(因为unsigned,比如1-2)
//char* mystrncpy(char* a,const char* b,size_t n) {
// assert(a != NULL && b != NULL && n != 0);//在线oj不能用assert
// int i = 0;
// while (b[i]!='\0'&&i<n){
// a[i] = b[i];
// i++;
// }
// //第一种情况i=n了,b[i]还没等于\0
// if (i == n) {
// return a;
// }
// //第二种情况,b[i]等于\0,i还没等于n
// if (i < n) {
// while (i<n){
// a[i] = '\0';
// i++;
// }
// return a;
// }
//}
//int main() {
// char a[1024] = "mmafaagdgda";
// char b[] = "afas";
// printf("%s",mystrncpy(a,b,9));
// return 0;
//}