这几个函数实现过程中,一定先要进行合理性检验,也就是各种非法制,然后通过2个或3个指针的指向来完成。
1.strcpy(实现字符串拷贝)
把含有’\0’结束符的字符串复制到另一个地址空间
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void Strcpy(char b[], char a[]){
char *left, *left1;
left = a;
left1 = b;
while (*left != '\0'){
*left1++ = *left++;
}
*left1 = '\0';
}
int main(){
char a[] = "Hello World!";
char b[] = "";
Strcpy(b, a);
printf("%s\n", b);
system("pause");
return 0;
}
2.strcat(实现字符串拼接)
将两个字符串连接中间无空格
2模拟实现strcat
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void Strcat(char a[], char b[]){
char* right = a;
char* left1 = b;
while (*right != '\0'){
right++;
}
while (*left1 != '\0'){
*right++ = *left1++;
}
}
int main(){
char a[20] = "Good";
char b[20] = "Morning!";
Strcat(a, b);
printf("%s\n", a);
system("pause");
return 0;
}
3.strstr(查找子串在主串中位置)
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
char* Strstr(char a[], char b[]){
if (*a == NULL || *b == NULL){
return NULL;
}
if (*b == '\0'){
return NULL;
}
char *black = a;
if (*black != '\0'){
char *red = black;
char *blue = b;
while (*red == *blue && *red != '\0' && *blue != '\0'){
++blue;
++red;
}
if (*blue == '\0'){
return black;
}
else{ // *red 等于 ‘\0’和 *red != *blue
++black;
}
}
}
int main(){
char a[] = "hellohe";;
char b[] = "ellos";
printf("%s\n", Strstr(a, b));
system("pause");
return 0;
}
4.strchr(查找指定字符在字符串位置)
trchr函数功能为在一个串中查找给定字符的第一个匹配之处。函数原型为:char *strchr(const char *str, int c),即在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
char* Strchr(const char* str,const char c){
if (str == NULL){
return NULL;
}
while (*str != c && *str != '\0'){
++str;
}
if (*str == '\0'){
return NULL;
}
else{
return str;
}
}
int main(){
const char str[] = "hahalala";
const char c = 'm';
printf("%s\n", Strchr(str,c));
system("pause");
return 0;
}
5.strcmp(比较俩个字符串大小)
trcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int Strcmp(const char* str, const char* chr){
assert(str != NULL && chr != NULL); //不满足程序崩溃,assert和if else 差不多
while (*str != '\0' && *chr != '\0'){
if (*str < *chr){
return 1;
}
else if (*str > *chr){
return -1;
}
else{
++str;
++chr;
}
}
if (*str < *chr){ //str短
return -1;
}
else if (*str > *chr){ //chr短
return 1;
}
else{
return 0;
}
}
int main(){
const char a[] = "haha";
const char b[] = "hehe";
int ret = Strcmp(a, b);
if (ret < 0){
printf("a < b\n");
}
else if (ret > 0){
printf("a > b\n");
}
else{
printf("a = b\n");
}
system("pause");
return 0;
}
6.memcpy(实现内存中拷贝)
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void *Memcpy(void *destin, void *source, unsigned n){
if (destin == NULL || source == NULL){
return destin;
}
char *p1 = (char*)destin; //void* 只知道房间号不知道内存大小,所以不能解引用,必须强转为char*。void*还不能进行加减。
char *p2 = (char*)source;
for (unsigned i = 0; i < n; i++){
*p1 = *p2;
p1++;
p2++;
}
return destin;
}
int main(){
char a[] = "hahahehe";
char b[] = "sssswi";
printf("%s\n", Memcpy(a, b, sizeof(b)));
system("pause");
return 0;
}
7.memove(实现有重叠内存拷贝)
memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void *Memmove(void *destin, void *source, unsigned n){
if (destin == NULL || source == NULL || n == 0){
return destin;
}
char *p1 = (char*)destin; //void* 只知道房间号不知道内存大小,所以不能解引用,必须强转为char*。void*还不能进行加减。
char *p2 = (char*)source;
if (p1 >= p2 && p1 <= p2 + n){ //缓冲区重叠了
p1 = p1 + n - 1;
p2 = p2 + n - 1;
for (unsigned i = 0; i < n; i++){
*p1 = *p2;
p1--;
p2--;
}
}
else{ //缓冲区没有重叠
for (unsigned i = 0; i < n; i++){
*p1 = *p2;
p1++;
p2++;
}
}
return destin;
}
int main(){
char a[] = "hahahehe";
char b[] = "sssswi";
printf("%s\n", Memmove(a, a+2, sizeof(a)));
system("pause");
return 0;
}
`