Errores, fallos, preguntas - página 2578

 

Prueba con

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

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

Después de que esto haya funcionado, yo dirigiría mi atención a wcscpy.


 
Vict:

Prueba con

Después de que esto haya funcionado, yo dirigiría mi atención a wcscpy.


No, no ha funcionado así, la cadena no se pasa, pero tampoco hay problema.
Esto funciona sin el cero, pero el final de la cadena queda flotando con caracteres extra.

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);
}
 
Inicializo con un tamaño de puntero, y uso un puntero en memcpy, así que está bien :))
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:


No, no funciona así, no se pasa la cadena, pero tampoco hay problema.
Pero funcionó así, pero de nuevo el final de la cadena está flotando con caracteres extra.

Lea atentamente la documentación de std::wcslen.

Devuelve la longitud de una cadena ancha, es decir, el número de caracteres anchos no nulos que preceden al carácter ancho nulo de terminación.

Si no lo entiendes, busca ayuda en Google:

Devuelve la longitud de una cadena ancha, es decir, el número de caracteres anchos no nulos que preceden al carácter ancho nulo de terminación. Si no nos lo creemos del todo, hacemos un cheque:

#include <iostream>
#include <cwchar>

int main()
{
        const wchar_t* text = L"12345";
        std::cout << std::wcslen(text);
        return 0;
}
Inicie y vea:

Vuelve a escribir:

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

Conclusión: Primero leemos los muelles, no entienden, ir al foro, leer el foro, recuerde que alguien que escribe en el foro, probablemente el mismo gurú que eres, respectivamente, después de que el foro de nuevo muelles abiertos, escribir una prueba, ohrenzied por el conocimiento de un gurú en el foro, se consideran inteligentes como un pato, escribir código, ohrenzied por los errores, de nuevo un ciclo muelles-foro, aprender acerca de ub, encontrar donde el error, ohrenzied en su estupidez.

A grandes rasgos, así es como funciona.

PS. Esto es C, esto es hardcore, aquí no hay que fumar foros, sólo publicaciones y docs serios, sólo tu propio cerebro.

 
Roman:


No, no ha funcionado, la cadena no se pasa, pero tampoco hay problema.
Pero funcionó así sin cero, pero flota el final de la cadena con caracteres extra.

Si no funcionaba, se introducía una cadena vacía en la entrada. Mi opción es correcta y funciona, la tuya no.

#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

Si sobreescribes el buffer con un gran margen, naturalmente la línea deseada también se captura.

 
Vladimir Simakov:

PS. Esto es C, esto es hardcore, no hay foros para fumar aquí, sólo publicaciones y docs serios, sólo tus propios cerebros.

Este hardcore(wcslen(data)+1) ya lo he probado, y ahora he probado tu versión, la cadena no se copia en absoluto.

 
Roman:

Este hardcore(wcslen(data)+1) ya lo he probado, y ahora he probado tu opción, la cadena no se copia en absoluto.

¿Y qué significa el segundo parámetro de la función memspy_s?

 
Vladimir Simakov:

¿Qué significa el segundo parámetro de la función memspy_s?

Déjame intentar adivinar

- longitud de la cadena fuera., sólo +1 carácter, que /000 olvidó.

 
Vict:

Si no funcionaba, se introducía una cadena vacía en la entrada. Mi opción es correcta y funciona, la tuya no.

Estúpidamente sobreescribes el buffer con un gran margen, por supuesto, que la cadena correcta se captura también.

¿Cómo es una cadena vacía? Cuando la cadena sale de un enchufe, en otras variantes aunque esté torcida, no está vacía.
No digo que tu variante sea incorrecta, pero en tu variante utilizas un array de cadenas.
En mi caso es un puntero.

const wchar_t* data = getData();

La función socket devuelve un puntero a const wchar_t*.
Porque lo achaco a un bug en mql, porque he probado muchas funciones C diferentes, hardcore +1 o +2.
Simplemente no funcionará.

 
Vladimir Simakov:
Déjame intentar adivinar

- longitud de la cadena fuera., sólo +1 carácter, que /000 olvidó.

Si te refieres a esto

StringInit(out, 201, 32);

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

Entonces la cadena se copia muy raramente, y con grandes desfases temporales.
Esta variante ya fue probada al principio, retrocede un par de páginas, allí coloqué capturas de pantalla.

Aquí está el mismo comportamiento que en la segunda captura de pantalla, los modders por qué los nombres de los archivos en el krakozrabryy reemplazado.

Como ves, incluso esta funciónwcscpy(out, data); que cuenta automáticamente la longitud de la cadena, provoca el mismo comportamiento, saltándose la cadena completa.