Fehler, Irrtümer, Fragen - Seite 2578

 

Versuchen Sie

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

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

Nachdem dies funktioniert hat, würde ich meine Aufmerksamkeit auf wcscpy richten.


 
Vict:

Versuchen Sie

Nachdem dies funktioniert hat, würde ich meine Aufmerksamkeit auf wcscpy richten.


Nein, so hat es nicht funktioniert, der String wird nicht übergeben, aber es gibt auch kein Problem.
Das funktioniert auch ohne die Null, aber das Ende der Zeichenkette ist mit zusätzlichen Zeichen durchsetzt.

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);
}
 
Ich initialisiere mit einer Zeigergröße und verwende einen Zeiger in memcpy, also ist es 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:


Nein, so funktioniert es nicht, die Zeichenfolge wird nicht übergeben, aber es gibt auch kein Problem.
Aber es funktionierte so, aber wieder ist das Ende der Zeichenkette mit zusätzlichen Zeichen umherschwebend.

Lesen Sie die std::wcslen-Dokumente sorgfältig durch.

Gibt die Länge einer breiten Zeichenkette zurück, d. h. die Anzahl der breiten Zeichen, die vor dem abschließenden breiten Null-Zeichen liegen und nicht null sind.

Wenn du es nicht verstehst, google Hilfe mi:

Gibt die Länge einer breiten Zeichenkette zurück, d. h. die Anzahl der breiten Zeichen, die vor dem abschließenden breiten Null-Zeichen liegen und nicht null sind. Wenn wir überhaupt nicht daran glauben, stellen wir einen Scheck aus:

#include <iostream>
#include <cwchar>

int main()
{
        const wchar_t* text = L"12345";
        std::cout << std::wcslen(text);
        return 0;
}
Starten und sehen:

Umschreiben:

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

Fazit: Zuerst lesen wir die Docks, nicht verstehen, gehen Sie auf das Forum, lesen Sie das Forum, daran erinnern, dass jemand, der auf dem Forum schreibt, wahrscheinlich die gleichen Guru wie Sie sind, bzw. nach dem Forum wieder offen Docks, schreiben Sie einen Test, ohrenzing durch das Wissen eines Gurus auf dem Forum, halten sich für schlau wie eine Ente, Code zu schreiben, ohrenzing durch Bugs, wieder einen Zyklus Docks-Forum, lernen Sie über ub, finden, wo der Fehler, ohrenzing an seiner Dummheit.

Das funktioniert in etwa so.

PS. Das ist C, das ist Hardcore, hier sollte man keine Foren rauchen, nur seriöse Publikationen und Dokumente, nur sein eigenes Hirn.

 
Roman:


Nein, es hat nicht funktioniert, der String wird nicht übergeben, aber es gibt auch kein Problem.
Aber es funktionierte auf diese Weise ohne Null, aber es fließt das Ende der Zeichenfolge mit zusätzlichen Zeichen.

Wenn das nicht funktionierte, wurde eine leere Zeichenkette in die Eingabe eingespeist. Meine Option ist korrekt und funktioniert, Ihre nicht.

#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

Sie überschreiben den Puffer stumpf mit einem großen Rand, natürlich wird auch die gewünschte Zeile erfasst.

 
Vladimir Simakov:

PS. Das ist C, das ist Hardcore, hier gibt es keine Foren zum Rauchen, nur seriöse Veröffentlichungen und Dokumente, nur Ihr eigenes Gehirn.

Dieses Hardcore(wcslen(data)+1) habe ich bereits ausprobiert, und jetzt habe ich Ihre Version versucht, die Zeichenfolge wird überhaupt nicht kopiert.

 
Roman:

Dieses Hardcore(wcslen(data)+1) habe ich bereits ausprobiert, und jetzt habe ich Ihre Option versucht, die Zeichenfolge wird überhaupt nicht kopiert.

Und was bedeutet der zweite Parameter in der Funktion memspy_s?

 
Vladimir Simakov:

Was bedeutet der zweite Parameter in der Funktion memspy_s?

Lassen Sie mich versuchen zu raten

- Stringlänge aus, nur +1 Zeichen, das /000 vergessen hat.

 
Vict:

Wenn das nicht funktionierte, wurde eine leere Zeichenkette in die Eingabe eingespeist. Meine Option ist korrekt und funktioniert, Ihre nicht.

Sie überschreiben dummerweise den Puffer mit einem großen Abstand, damit auch die richtige Zeichenfolge erfasst wird.

Was ist eine leere Zeichenkette? Wenn die Zeichenkette aus einer Steckdose kommt, ist sie in anderen Varianten zwar krumm, aber nicht leer.
Ich sage nicht, dass Ihre Variante falsch ist, aber in Ihrer Variante verwenden Sie ein Array von String.
In meinem Fall ist es ein Zeiger.

const wchar_t* data = getData();

Die Funktion socket gibt einen Zeiger auf const wchar_t* zurück.
Weil ich es auf einen Fehler in mql schiebe, weil ich so viele verschiedene C-Funktionen ausprobiert habe, hardcore +1 oder +2.
Es wird einfach nicht funktionieren.

 
Vladimir Simakov:
Lassen Sie mich versuchen zu raten

- Stringlänge aus, nur +1 Zeichen, das /000 vergessen hat.

Wenn Sie damit Folgendes meinen

StringInit(out, 201, 32);

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

Dann wird die Zeichenfolge nur sehr selten und mit großer zeitlicher Verzögerung kopiert.
Diese Variante wurde bereits ganz am Anfang ausprobiert, gehen Sie ein paar Seiten zurück, dort habe ich Screenshots gepostet.

Hier ist das gleiche Verhalten wie im zweiten Screenshot, die Modder, warum die Namen der Dateien auf der krakozrabryy ersetzt.

Sie sehen, auch diese Funktionwcscpy(out, data); die automatisch die Länge der Zeichenkette zählt, verursacht das gleiche Verhalten, nämlich das Überspringen der gesamten Zeichenkette.