エラー、バグ、質問 - ページ 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に目を向けます。


いや、この方法では、文字列は渡されないが、問題もない。
これは0を入れなくても動作しますが、文字列の末尾が余計な文字で浮いてしまいます。

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で ポインタを使うので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:


いいえ、そのように動作しません。文字列は渡されませんが、問題もありません。
しかし、このように動作したのですが、やはり文字列の最後が余分な文字で浮いています。

std::wcslenのドキュメントをよく読んでください。

ワイド文字列の長さ(終端ヌルワイド文字の前にあるヌルでないワイド文字の数)を返します。

理解できない場合は、google help mi:

ワイド文字列の長さ(終端ヌルワイド文字の前にあるヌルでないワイド文字の数)を返します。全く信じられなければ、小切手を書くのです。

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

結論:最初に我々は、ドックを読んで理解していない、フォーラムに行き、フォーラムを読んで、フォーラムで書き込み誰かが、おそらくあなたと同じ教祖は、それぞれ、フォーラムは再びドックを開いた後、テストを書いて、フォーラムで教祖の知識によってohrenzied、アヒルのように自分自身をスマート考える、コードを書き、バグによってohrenzied、再びサイクルドックスフォーラム、UBについて学び、彼の愚かさで、ohrenziedどこにミスが見つかります。

だいたいこんな感じです。

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関数の第2パラメータは何を意味するのでしょうか?

 
Vladimir Simakov:

memspy_s関数の第2パラメータは何を意味しているのでしょうか?

推測してみる

- 文字列の長さが 足りず、+1文字しかないため、/000が忘れてしまった。

 
Vict:

うまくいかなかった場合は、空の文字列が入力された。私のオプションは正しく動作していますが、あなたのオプションはそうではありません。

正しい文字列も取り込まれるのは当然として、バッファに大きな余裕を持って上書きしているのは愚かなことです。

空の文字列とはどのようなものですか?ソケットから文字列が来る場合、他のバリエーションでは、曲がっていても、空ではないのです。
あなたのバリアントが間違っているとは言いませんが、あなたのバリアントでは、文字列の配列を使っていますね。
私の場合はポインターです。

const wchar_t* data = getData();

ソケット関数は、const wchar_t* へのポインタを返します。
なぜなら、私はそれをmqlのバグのせいにしているからです。なぜなら、私は非常に多くの異なる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)))

その場合、文字列のコピーは非常に稀で、大きなタイムラグが発生する。
このバリエーションはすでに一番最初に試されています。2ページほど戻って、そこにスクリーンショットを掲載しました。

ここでは、2番目のスクリーンショットと同じ動作 ですが、moddersなぜkrakozrabryy上のファイルの名前が置き換えられます。

文字列の長さを自動的にカウントするこの関数wcscpy(out, data);でも、文字列全体を読み飛ばすという同じ動作をしていることがわかります。