快速输入函数 -- inline int read()(输入大数据必备)

近日比赛看到题解用这个函数来进行输入数据,据说是比scanf还要快。

inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int main() {
    int n;
    while (n = read()) {
        cout << n << endl;
    }
}

注意一个点,直接输入0的话会直接跳出循环,但0还是会被读进去。
然后还有一个函数比这个更快的,看看就好,估计也用不到吧。。。
在这里插入图片描述
引用别人的解释之为什么会比前面那个快的原因:
这个,对于c(c++)里的标准输入输出是有行缓冲的,这里把原来的行缓冲改为S大小的字节流,一次读写S这么多,所以快了吧.

以下是一个使用 C++ 实现的 inline hook 拦截自己进程的 API 函数的示例代码: ```cpp #include <Windows.h> #include <iostream> // 原始的 API 函数指针 typedef int(__stdcall* OriginalFunction)(int); // 要拦截的 API 函数的名称 const char* FunctionName = "MessageBoxA"; // hook 函数,用于拦截 API 函数 int __stdcall HookFunction(int param) { std::cout << "API function is hooked!" << std::endl; // 调用原始的 API 函数 OriginalFunction originalFunction = (OriginalFunction)GetProcAddress(GetModuleHandleA("user32.dll"), FunctionName); return originalFunction(param); } int main() { // 获取要拦截的 API 函数的地址 OriginalFunction originalFunction = (OriginalFunction)GetProcAddress(GetModuleHandleA("user32.dll"), FunctionName); // 构造跳转指令,跳转到 hook 函数 unsigned char* pTarget = (unsigned char*)originalFunction; unsigned char jumpCode[] = { 0xE9, 0x00, 0x00, 0x00, 0x00 }; DWORD dwOldProtect; VirtualProtect(pTarget, sizeof(jumpCode), PAGE_EXECUTE_READWRITE, &dwOldProtect); DWORD dwOffset = ((DWORD)HookFunction - (DWORD)pTarget - 5); memcpy(&jumpCode[1], &dwOffset, sizeof(DWORD)); memcpy(pTarget, jumpCode, sizeof(jumpCode)); VirtualProtect(pTarget, sizeof(jumpCode), dwOldProtect, &dwOldProtect); // 调用被拦截的 API 函数 MessageBoxA(NULL, "Hello, world!", "Test", MB_OK); // 卸载 hook memcpy(pTarget, originalFunction, sizeof(jumpCode)); VirtualProtect(pTarget, sizeof(jumpCode), dwOldProtect, &dwOldProtect); return 0; } ``` 在上面的代码中,我们使用了 `GetProcAddress` 函数获取了要拦截的 API 函数的地址,并构造了一个跳转指令,跳转到我们自己编写的 hook 函数中。在 hook 函数中,我们保存了原始的 API 函数地址,并执行了自己的代码逻辑,最后调用了原始的 API 函数。在卸载 hook 时,我们将跳转指令还原为原始的 API 函数地址。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值