Ошибки, баги, вопросы - страница 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

Returns the length of a wide string, that is the number of non-null wide characters that precede the terminating null wide character.

Если don't undestand, то гугл хелп ми:

Возвращает длину широкой строки, то есть количество ненулевых широких символов, которые предшествуют завершающему нулевому широкому символу. Если совсем не верим, то пишем проверку:

#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))) 

Вывод: сначала читаем доки, не поняли, идем на форум, читаем форум, помним, что тот, кто пишет на форуме, возможно такой же гуру как и ты сам, соответственно, после форума опять открываем доки, пишем тест, охреневаем от знаний гуру на форуме, считаем себя вумным как утка, пишем код, охреневаем от багов, опять цикл доки-форум, узнаем про ub, находим где накосячили, охреневаем от своей тупости.

Примерно так и происходит.

PS. Это С, это хардкор, тут форумы курить не стоит, только серьезные издания и доки, только свои мозги.

 
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. Это С, это хардкор, тут форумы курить не стоит, только серьезные издания и доки, только свои мозги.

Этот хардкор (wcslen(data)+1я уже пробовал, и сейчас попробовал ваш вариант, строка не копируется вообще.

 
Roman:

Этот хардкор (wcslen(data)+1я уже пробовал, и сейчас попробовал ваш вариант, строка не копируется вообще.

А что означает второй параметр в функции memspy_s?

 
Vladimir Simakov:

А что означает второй параметр в функции memspy_s?

Попробую угадать

 - длина строки out., только +1 символ, который /000 забыли.

 
Vict:

Если не сработало, значит на вход подавалась пустая строка. Вариант мой правильный и рабочий, ваш нет.

Вы тупо перезаписывайте буфер с большим запасом, естественно, что захватывается и нужная строка.

Ну как пустая строка? Когда строка из сокета поступает, в других вариантах хоть и кривая, но она не пустая.
Я не говорю что ваш вариант не правильный, но в вашем варианте вы используете массив строки.
В моём случае  это указатель

const wchar_t* data = getData();

Сокетная функция возвращает указатель на const wchar_t*
По этому я и грешу на mql баг, потому что уже какие только сишные функции не пробовал, хардкоры с +1 или +2 применял.
Не идёт и всё.

 
Vladimir Simakov:
Попробую угадать

 - длина строки out., только +1 символ, который /000 забыли.

Если вы имеете ввиду об этом

StringInit(out, 201, 32);

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

То строка копируется очень редко, и с большими пропусками по времени.
Этот вариант уже пробовался в самом начале, полистайте пару страниц назад, там я скрины выкладывал.

Вот, такое же поведение как на втором скрине, модеры зачем то имена файлов на кракозябры заменили.

Понимаете, даже вот эта функция  wcscpy(out, data);  которая автоматически считает длину строки, вызывает такое же поведение, временной пропуск всей строки.

Причина обращения: