错误、漏洞、问题 - 页 2578

 

尝试

StringInit(out, 200, 32);
...

if ( memcpy_s(out, 200*sizeof(wchar_t), data, wcslen(data)*sizeof(wchar_t)+sizeof(L'\0')) ) {
   // что-то пошло не так
}

在这一方法奏效后,我将把注意力转向wcscpy。


 
Vict:

尝试

在这一方法奏效后,我将把注意力转向wcscpy。


不,不是这样的,字符串没有被传递,但也没有问题。
没有零也能工作,但字符串的末尾却漂浮着额外的字符。

StringInit(out, 200, 32);
if (memcpy_s(out, 200 * sizeof(wchar_t), data, wcslen(data) * sizeof(wchar_t)))     // + sizeof(L'\0'))) 
{
   MessageBoxW(NULL, L"Problem", L"Problem", MB_OK);
}
 
我初始化时有一个指针大小,在memcpy 中使用一个指针,所以它是可以的:))
StringInit(out, 1400, 32);

if (memcpy_s(out, 200 * sizeof(wchar_t*), data, wcslen(data) * sizeof(wchar_t*)))  
{
   MessageBoxW(NULL, L"Problem", L"Problem", MB_OK);
}
 
Roman:


不,不是这样的,字符串没有被传递,但也没有问题。
但它的工作原理是这样的,但字符串的末尾又浮现出额外的字符。

仔细阅读std::wcslen文档。

返回一个宽字符串的长度,即在结束的空宽字符之前的非空宽字符的数量。

如果不明白,请谷歌帮助我。

返回一个宽字符串的长度,也就是在结束的空宽字符之前的非空宽字符的数量。如果我们完全不相信,我们就写一张支票。

#include <iostream>
#include <cwchar>

int main()
{
        const wchar_t* text = L"12345";
        std::cout << std::wcslen(text);
        return 0;
}
启动并查看:

重写。

if (memcpy_s(out, 200 * sizeof(wchar_t), data, (wcslen(data)+1) * sizeof(wchar_t))) 

结论:首先我们看了docks,不明白,就去论坛,看了论坛,记得有人在论坛上写文章,可能和你是同一个大师,分别后,在论坛上再次打开docks,写了一个测试,哦,被论坛上一个大师的知识所迷惑,认为自己聪明如鸭,写代码,哦,被bug迷惑,再次循环docks-forum,了解ub,找到错误所在,哦,被自己愚蠢所迷惑。

大致上是这样的。

PS。这是C语言,这是硬核,在这里你不应该抽论坛,只抽严肃的出版物和文件,只抽你自己的大脑。

 
Roman:


不,它没有工作,字符串没有通过,但也没有问题。
但是,它在没有零的情况下是这样工作的,但是它在字符串的末端浮现了额外的字符。

如果没有成功,那么就向输入端输入一个空字符串。我的选项是正确的,而且在工作,你的选项则不是。

#include <cstring>
#include <iostream>
using namespace std;

int main() {
        wchar_t out[200];
        wchar_t data[] = L"Hello world";
        memcpy(out, data, wcslen(data)*sizeof(wchar_t)+sizeof(L'\0'));
        wcout << "string = " << out << endl;
}
// string = Hello world

你直截了当地用一个大的空白覆盖缓冲区,自然也就捕捉到了想要的那一行。

 
Vladimir Simakov:

PS。这是C,这是硬核,这里没有论坛可抽,只有严肃的出版物和文件,只有你自己的大脑。

这个硬核(wcslen(data)+1 我已经试过了,现在我又试了一下你的版本,字符串根本就没有被复制。

 
Roman:

这个硬核(wcslen(data)+1 我已经试过了,现在我又试了一下你的选项,字符串根本就没有复制。

而memspy_s函数中的第二个参数是什么意思?

 
Vladimir Simakov:

memspy_s函数中的第二个参数是什么意思?

让我尝试猜测一下

-字符串的长度 出来了,只有+1个字符,这一点/000忘记了。

 
Vict:

如果没有成功,那么就向输入端输入一个空字符串。我的选项是正确的,而且在工作,你的选项则不是。

你愚蠢地覆盖了缓冲区,有很大的余地,当然,正确的字符串也被捕获。

如何是一个空字符串?当字符串来自插座时,在其他变体中,虽然它是歪的,但它不是空的。
我不是说你的变体是错的,但在你的变体中,你使用了一个字符串数组。
在我的例子中,它是一个指针。

const wchar_t* data = getData();

socket函数返回一个指向const wchar_t*的指针。
因为我把它归咎于mql的bug,因为我已经尝试了很多不同的C函数,硬核+1或+2。
它只是不会工作。

 
Vladimir Simakov:
让我尝试猜测一下

-字符串的长度 出来了,只有+1个字符,这一点/000忘记了。

如果你是指关于这个

StringInit(out, 201, 32);

if (memcpy_s(out, 201 * sizeof(wchar_t), data, (wcslen(data) + 1) * sizeof(wchar_t)))

那么字符串的复制就非常少,而且有很大的时间滞后。
这个变体在一开始就已经试过了,往前翻几页,我在那里贴了截图。

下面是与第二张截图相同的行为,修改者为什么把krakozrabryy上的文件名替换掉。

你看,即使是wcscpy(out, data) 这个自动计算字符串长度的函数,也会导致同样的行为,时间上跳过整个字符串。