Errori, bug, domande - pagina 2578

 

Prova

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

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

Dopo che questo ha funzionato, rivolgerei la mia attenzione a wcscpy.


 
Vict:

Prova

Dopo che questo ha funzionato, rivolgerei la mia attenzione a wcscpy.


No, non ha funzionato in questo modo, la stringa non viene passata, ma non c'è nemmeno un problema.
Questo funziona senza lo zero, ma la fine della stringa galleggia con caratteri 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);
}
 
Inizializzo con una dimensione del puntatore, e uso il puntatore in memcpy, quindi è OK :))
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, non funziona così, la stringa non viene passata, ma non c'è nemmeno un problema.
Ma ha funzionato così, ma di nuovo la fine della stringa galleggia con caratteri extra.

Leggete attentamente i documenti di std::wcslen.

Restituisce la lunghezza di una stringa larga, cioè il numero di caratteri larghi non nulli che precedono il carattere largo nullo finale.

Se non capisci, google mi aiuta:

Restituisce la lunghezza di una stringa larga, cioè il numero di caratteri larghi non nulli che precedono il carattere largo nullo finale. Se non ci crediamo affatto, facciamo un assegno:

#include <iostream>
#include <cwchar>

int main()
{
        const wchar_t* text = L"12345";
        std::cout << std::wcslen(text);
        return 0;
}
Lanciare e vedere:

Riscrivere:

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

Conclusione: prima abbiamo letto i docks, non capiscono, andare al forum, leggere il forum, ricordare che qualcuno che scrive sul forum, probabilmente lo stesso guru come sei, rispettivamente, dopo il forum di nuovo aperto docks, scrivere un test, ohrenzied dalla conoscenza di un guru sul forum, si considerano intelligente come un'anatra, scrivere codice, ohrenzied da bug, ancora un ciclo docks-forum, imparare su ub, trovare dove l'errore, ohrenzied alla sua stupidità.

Questo è più o meno come funziona.

PS. Questo è C, questo è hardcore, qui non si devono fumare forum, solo pubblicazioni e documenti seri, solo il proprio cervello.

 
Roman:


No, non ha funzionato, la stringa non viene passata, ma non c'è nemmeno un problema.
E questo modo senza zero ha funzionato, ma fa galleggiare la fine della stringa con caratteri extra.

Se non ha funzionato, allora una stringa vuota è stata inserita nell'input. La mia opzione è corretta e funzionante, la tua 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 sovrascrive bruscamente il buffer con un ampio margine, naturalmente viene catturata anche la linea desiderata.

 
Vladimir Simakov:

PS. Questo è C, questo è hardcore, nessun forum da fumare qui, solo pubblicazioni e documenti seri, solo il vostro cervello.

Questo hardcore(wcslen(data)+1) l'ho già provato, e ora ho provato la tua versione, la stringa non viene copiata affatto.

 
Roman:

Questo hardcore(wcslen(data)+1) l'ho già provato, e ora ho provato la tua opzione, la stringa non si copia affatto.

E cosa significa il secondo parametro nella funzione memspy_s?

 
Vladimir Simakov:

Cosa significa il secondo parametro nella funzione memspy_s?

Lasciami provare a indovinare

- lunghezza della stringa fuori, solo +1 carattere, che /000 ha dimenticato.

 
Vict:

Se non ha funzionato, allora una stringa vuota è stata inserita nell'input. La mia opzione è corretta e funzionante, la tua no.

Stai stupidamente sovrascrivendo il buffer con un ampio margine, ovviamente, che venga catturata anche la stringa giusta.

Com'è una stringa vuota? Quando la stringa viene da una presa, in altre varianti anche se è storta, non è vuota.
Non sto dicendo che la tua variante è sbagliata, ma nella tua variante usi un array di stringhe.
Nel mio caso è un puntatore.

const wchar_t* data = getData();

La funzione socket restituisce un puntatore a const wchar_t*.
Perché do la colpa al bug in mql, perché ho provato tante funzioni C diverse, hardcore +1 o +2.
Semplicemente non funziona.

 
Vladimir Simakov:
Lasciami provare a indovinare

- lunghezza della stringa fuori, solo +1 carattere, che /000 ha dimenticato.

Se intendi questo

StringInit(out, 201, 32);

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

Poi la stringa viene copiata molto raramente e con grandi ritardi.
Questa variante è già stata provata all'inizio, torna indietro di un paio di pagine, ho postato degli screenshot lì.

Ecco lo stesso comportamento come nel secondo screenshot, i modder perché i nomi dei file sul krakozrabryy sostituito.

Vedete, anche questa funzionewcscpy(out, data); che conta automaticamente la lunghezza della stringa, provoca lo stesso comportamento, saltando l'intera stringa.