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)