不用memcpy怎么写
时间: 2024-05-23 09:08:01 浏览: 10
可以使用循环逐个复制的方式代替memcpy函数。以下是一个示例代码:
```
void my_memcpy(void* dest, const void* src, size_t n) {
char* p_dest = (char*)dest;
const char* p_src = (const char*)src;
for (size_t i = 0; i < n; ++i) {
p_dest[i] = p_src[i];
}
}
```
上述代码中,我们将void指针类型转换为char指针类型,并使用for循环逐个复制。需要注意的是,这种方式可能比memcpy函数慢,因为memcpy函数通常是经过优化的汇编代码实现的,而循环逐个复制则需要进行多次操作。
相关问题
c语言中EDID拨码的函数不用到linux怎么写
如果不使用Linux系统的API,可以通过第三方库或者直接操作硬件接口实现在C语言中读取显示器的EDID信息。以下是一个使用Windows系统的API读取EDID信息的示例:
```c
#include <windows.h>
#include <stdio.h>
BOOL GetEDID(BYTE EDIDBuffer[128])
{
DISPLAY_DEVICE displayDevice;
DWORD deviceIndex = 0;
DWORD displayIndex = 0;
HDC displayHandle;
ZeroMemory(&displayDevice, sizeof(DISPLAY_DEVICE));
displayDevice.cb = sizeof(DISPLAY_DEVICE);
// Find the display device for each display
while (EnumDisplayDevices(NULL, deviceIndex, &displayDevice, 0))
{
if (displayDevice.StateFlags & DISPLAY_DEVICE_ACTIVE)
{
ZeroMemory(&displayDevice, sizeof(DISPLAY_DEVICE));
displayDevice.cb = sizeof(DISPLAY_DEVICE);
while (EnumDisplayDevices(NULL, deviceIndex, &displayDevice, 0))
{
if (displayDevice.StateFlags & DISPLAY_DEVICE_ACTIVE)
{
if (EnumDisplayDevices(displayDevice.DeviceName, displayIndex, &displayDevice, 0))
{
displayHandle = CreateDC(displayDevice.DeviceName, NULL, NULL, NULL);
if (displayHandle != NULL)
{
if (GetEDIDFromMonitor(displayHandle, EDIDBuffer))
{
return TRUE;
}
DeleteDC(displayHandle);
}
}
}
displayIndex++;
ZeroMemory(&displayDevice, sizeof(DISPLAY_DEVICE));
displayDevice.cb = sizeof(DISPLAY_DEVICE);
}
}
deviceIndex++;
displayIndex = 0;
ZeroMemory(&displayDevice, sizeof(DISPLAY_DEVICE));
displayDevice.cb = sizeof(DISPLAY_DEVICE);
}
return FALSE;
}
BOOL GetEDIDFromMonitor(HDC displayHandle, BYTE EDIDBuffer[128])
{
DISPLAY_DEVICE displayDevice;
ZeroMemory(&displayDevice, sizeof(DISPLAY_DEVICE));
displayDevice.cb = sizeof(DISPLAY_DEVICE);
if (EnumDisplayDevices(NULL, 0, &displayDevice, 0))
{
DISPLAY_DEVICE monitorDevice;
ZeroMemory(&monitorDevice, sizeof(DISPLAY_DEVICE));
monitorDevice.cb = sizeof(DISPLAY_DEVICE);
if (EnumDisplayDevices(displayDevice.DeviceName, 0, &monitorDevice, 0))
{
HMONITOR hMonitor = NULL;
MONITORINFOEX monitorInfo;
ZeroMemory(&monitorInfo, sizeof(MONITORINFOEX));
monitorInfo.cbSize = sizeof(MONITORINFOEX);
for (DWORD monitorIndex = 0; EnumDisplayDevices(displayDevice.DeviceName, monitorIndex, &monitorDevice, 0); monitorIndex++)
{
hMonitor = MonitorFromPoint(monitorInfo.rcMonitor.topLeft, MONITOR_DEFAULTTONEAREST);
if (hMonitor != NULL)
{
MONITORINFOEX monitorInfo;
ZeroMemory(&monitorInfo, sizeof(MONITORINFOEX));
monitorInfo.cbSize = sizeof(MONITORINFOEX);
if (GetMonitorInfo(hMonitor, &monitorInfo))
{
PHYSICAL_MONITOR physicalMonitor;
HANDLE physicalMonitorHandle;
if (GetPhysicalMonitorsFromHMONITOR(hMonitor, 1, &physicalMonitor))
{
physicalMonitorHandle = physicalMonitor.hPhysicalMonitor;
if (GetEDIDFromPhysicalMonitor(physicalMonitorHandle, EDIDBuffer))
{
DestroyPhysicalMonitor(physicalMonitorHandle);
return TRUE;
}
}
}
}
}
}
}
return FALSE;
}
BOOL GetEDIDFromPhysicalMonitor(HANDLE physicalMonitorHandle, BYTE EDIDBuffer[128])
{
DWORD numEDIDBytes = 0;
if (GetNumberOfPhysicalMonitorsFromHMONITOR(physicalMonitorHandle, &numEDIDBytes))
{
if (numEDIDBytes > 0)
{
BYTE* EDID = (BYTE*)malloc(numEDIDBytes * sizeof(BYTE));
if (EDID != NULL)
{
if (GetPhysicalMonitorsFromHMONITOR(physicalMonitorHandle, numEDIDBytes, EDID))
{
memcpy(EDIDBuffer, EDID, 128);
修改此代码使其能够完成功能,直接写代码不用解释: void AddWatermark(char* filename) { //添加一个文件的句柄 FILE* fp = fopen(filename, "rb"); //将文件保存一份 FILE* newfp = fopen("jjbwhater.bmp", "wb"); // 水印内容 char watermark[12] = "Hello Word"; // 将水印长度赋给变量 int watermark_length = strlen(watermark); // 申请一块内存,用于存放文件内容 char* buffer = (char*)malloc(sizeof(char) * 1000); while (fread(buffer, 100, 1, fp) != 0) { /* 添加水印内容 */ memcpy(buffer + 100 - watermark_length, watermark, watermark_length); /*将内容写到新文件 */ fwrite(buffer, 100, 1, newfp); /*重置buffer / memset(buffer, 0, 1000); } / 关闭文件,释放内存 */ fclose(fp); fclose(newfp); free(buffer); }
void AddWatermark(char* filename) {
//添加一个文件的句柄
FILE* fp = fopen(filename, "rb");
//将文件保存一份
FILE* newfp = fopen("jjbwhater.bmp", "wb");
// 水印内容
char watermark[12] = "Hello Word";
// 将水印长度赋给变量
int watermark_length = strlen(watermark);
// 申请一块内存,用于存放文件内容
char* buffer = (char*)malloc(sizeof(char) * 1000);
while (fread(buffer, 100, 1, fp) != 0) {
/* 添加水印内容 */
memcpy(buffer + 100 - watermark_length, watermark, watermark_length);
/*将内容写到新文件 */
fwrite(buffer, 100, 1, newfp);
/*重置buffer */
memset(buffer, 0, 1000);
}
/* 关闭文件,释放内存 */
fclose(fp);
fclose(newfp);
free(buffer);
}