CommonFunction.h

#include <cstdio>
#include <cassert>
#include <cstring>
#include <iostream>
#include <string>


char* WeStrcpy(char* dest_buf, const char* src_buf);
char* WeStrncpy(char* dest_buf, const char* src_buf, int size);
char* WeStrcat(char* dest_buf, const char* src_buf);
char* WeStrncat(char* dest_buf, const char* src_buf, int size);
void* WeMemcpy(void* dest_buf, const void* src_buf, int size);
void* WeMemset(void* dest_buf, int value, int size);
void* WeMemmove(void* dest_buf, const void* src_buf, int size);

CommonFunction.cpp

#include "CommonFunction.h"


char* WeStrcpy(char* dest_buf, const char* src_buf)
{
	if (dest_buf == nullptr || src_buf == nullptr) { // 空指针判断
		throw "Invalid parameter";
	}
	char* dest_buf_cpy = dest_buf;                   // 记录好指针头部不变
	while (*src_buf != '\0') {
		*(dest_buf_cpy++) = *(src_buf++);
	}
	return dest_buf;
}

char* WeStrncpy(char* dest_buf, const char* src_buf, int size)
{
	assert(dest_buf != nullptr && src_buf != nullptr);
	assert(size >= 0);
	char* dest_buf_cpy = dest_buf;                   // 记录好指针头部不变
	while (( * src_buf != '\0')&& size > 0) {
		*(dest_buf_cpy++) = *(src_buf++);
		size--;
	}
	return dest_buf;
}

char* WeStrcat(char* dest_buf, const char* src_buf)
{
	assert(dest_buf != nullptr && src_buf != nullptr);
	int offset = strlen(dest_buf);                   // strlen 计算有效字符的长度
	char* dest_buf_cpy = dest_buf + offset;          // 记录好指针是目的指针+目的有效字符的长度开始
	while (*src_buf != '\0') {
		*(dest_buf_cpy++) = *(src_buf++);
	}
	return dest_buf;
}


char* WeStrncat(char* dest_buf, const char* src_buf, int size)
{
	assert(dest_buf != nullptr && src_buf != nullptr);
	assert(size >= 0);
	int offset = strlen(dest_buf);                   // strlen 计算有效字符的长度
	char* dest_buf_cpy = dest_buf + offset;          // 记录好指针是目的指针+目的有效字符的长度开始
	while ((*src_buf != '\0') && size > 0) {
		*(dest_buf_cpy++) = *(src_buf++);
		size--;
	}
	return dest_buf;
}


void* WeMemcpy(void* dest_buf, const void* src_buf, int size)
{
	assert(dest_buf != nullptr && src_buf != nullptr);
	assert(size >= 0);
	char* dest_buf_cpy = nullptr;
	char* src_buf_cpy = nullptr;
	if ((src_buf < dest_buf) && ((char*)src_buf + size > (char*)dest_buf)) { // 有重叠区域,考虑从后往前复制
		dest_buf_cpy = (char*)dest_buf + size - 1;
		src_buf_cpy = (char*)src_buf + size - 1;
		while (size > 0) {
			*(dest_buf_cpy--) = *(src_buf_cpy--);
			size--;
		}
	} else { // 没有重叠区域,从前往后拷贝
		dest_buf_cpy = (char*)dest_buf;
		src_buf_cpy = (char*)src_buf;
		while (size > 0) {
			*(dest_buf_cpy++) = *(src_buf_cpy++);
			size--;
		}
	}
	return dest_buf;
}


void* WeMemset(void* dest_buf, int value, int size)
{
	assert(dest_buf != nullptr);
	assert(size >= 0);
	char* dest_buf_cpy =static_cast<char*>(dest_buf);
	while (size > 0) {
		*(dest_buf_cpy++) = value;
		size--;
	}
	return dest_buf;
}


void* WeMemmove(void* dest_buf, const void* src_buf, int size)
{
	assert(dest_buf != nullptr && src_buf != nullptr);
	assert(size >= 0);
	char* dest_buf_cpy = (char*)dest_buf;
	char* src_buf_cpy = (char*)src_buf;
	if (src_buf_cpy < dest_buf_cpy && (src_buf_cpy + size) > dest_buf_cpy) { // 有重叠区域,考虑从后往前复制
		dest_buf_cpy = dest_buf_cpy + size - 1;
		src_buf_cpy = src_buf_cpy + size - 1;
		while (size > 0) {
			*(dest_buf_cpy--) = *(src_buf_cpy--);
			size--;
		}
	} else { // 没有重叠区域,从前往后拷贝
		while (size > 0) {
			*(dest_buf_cpy++) = *(src_buf_cpy++);
			size--;
		}
	}
	return dest_buf;
}





TestMain.cpp

#include "CommonFunction.h"

void Test(void)
{
    printf("----TestWeStrcpy------------------------------------\n");
    char dest1[1024];
    char src1[] = "abcd1234567890";
    char* dest_cpy1 = WeStrcpy(dest1, src1);
    printf("%s\n", dest_cpy1);
    printf("%s\n", dest1);

    printf("----TestWeStrncpy-----------------------------------\n");
    char dest2[1024];
    char src2[] = "abcd1234567890";
    char* dest_cpy2 = WeStrncpy(dest2, src2, 7);
    printf("%s\n", dest_cpy2);
    printf("%s\n", dest2);

    printf("----TestWeStrcat------------------------------------\n");
    char dest3[1024] = "10086";
    char src3[] = "abcd1234567890";
    char* dest_cpy3 = WeStrcat(dest3, src3);
    printf("%s\n", dest_cpy3);
    printf("%s\n", dest3);


    printf("----TestWeStrncat-----------------------------------\n");
    char dest4[1024] = "10086";
    char src4[] = "abcd1234567890";
    char* dest_cpy4 = WeStrncat(dest4, src4, 4);
    printf("%s\n", dest_cpy4);
    printf("%s\n", dest4);

    printf("----TestWeMemcpy-----------------------------------\n");
    char dest5[256];
    char src5[] = "abcd1234567890";
    char* dest_cpy5 = (char*)WeMemcpy(static_cast<void*>(dest5), static_cast<void*>(src5), sizeof(dest5));
    printf("%s\n", dest_cpy5);

    printf("----TestWeMemset-----------------------------------\n");
    char dest6[20];
    int value = 0;
    char* dest_cpy6 = (char*)WeMemset(static_cast<void*>(dest6), value, sizeof(dest6));
    for (int i = 0; i < sizeof(dest6); i++) {
        printf("%d ", dest_cpy6[i]);
    }
    printf("\n");

    printf("----TestWeMemmove---------------------------------\n");
    char dest7[256];
    char src7[] = "abcd1234567890";
    char* dest_cpy7 = (char*)WeMemcpy(static_cast<void*>(dest7), static_cast<void*>(src7), sizeof(dest7));
    printf("%s\n", dest_cpy7);
}


int main(int argc, char** argv)
{
    Test();
    return 0;
}

Linux下编译需要的Makefile

BIN_NAME = CommFuncTest


SRCS = $(wildcard ./*.cpp)
OBJS = $(patsubst %.cpp,%.o,$(SRCS))

CXX = g++

all:$(BIN_NAME)
$(BIN_NAME):$(OBJS)
	@echo Linking $(notdir $@)
	@$(CXX) -o $@ $^ -fpermissive

%.o:%.cpp
	@echo Compiling $<
	@$(CXX) -c $< -o $@

.PHONY:clean
clean:
	rm -rf *.o
	rm -rf $(BIN_NAME)

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐