오류, 버그, 질문 - 페이지 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 에서 포인터를 사용하므로 모든 것이 괜찮습니다. :))
 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))) 

결론 : 먼저 우리는 부두를 읽고 이해하지 못했으며 포럼에 가고 포럼을 읽었습니다. 포럼에 글을 쓰는 사람은 아마도 포럼 이후에 당신 자신과 같은 전문가 일 것입니다. 부두를 다시 열고, 테스트를 작성하고, 포럼에서 전문가의 지식으로 빌어먹을 것입니다. 우리는 스스로를 오리처럼 똑똑하다고 생각하고, 코드를 작성하고, 버그에 걸리고, 다시 doki-forum 주기, 우리는 배웁니다. ub에 대해, 우리는 우리가 망친 곳을 찾고, 우리의 어리석음에서 망할 것입니다.

그것은 거의 일어나는 일입니다.

추신. 이것은 C입니다. 이것은 하드코어입니다. 여기에서 포럼을 피우면 안 됩니다. 진지한 출판물과 부두만, 오직 당신의 두뇌뿐입니다.

 
Roman :


아니요, 그런 식으로 작동하지 않았고 문자열이 전송되지 않았지만 문제가 없습니다.
이것이 0 없이 작동하는 방식이지만 행의 끝이 추가 문자와 함께 떠 있는 방식입니다.

작동하지 않으면 입력이 빈 문자열입니다. 내 버전은 정확하고 작동하지만 당신의 버전은 아닙니다.

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

추신. 이것은 C입니다. 이것은 하드코어입니다. 여기에서 포럼을 피우면 안 됩니다. 진지한 출판물과 부두만, 오직 당신의 두뇌뿐입니다.

이 하드코어 (wcslen(data)+ 1 ) 이미 시도했고 이제 귀하의 버전을 시도했지만 문자열이 전혀 복사되지 않습니다.

 
Roman :

이 하드코어 (wcslen(data)+ 1 ) 이미 시도했고 이제 귀하의 버전을 시도했지만 문자열이 전혀 복사되지 않습니다.

그리고 memspy_s 함수의 두 번째 매개변수는 무엇을 의미합니까?

 
Vladimir Simakov :

그리고 memspy_s 함수의 두 번째 매개변수는 무엇을 의미합니까?

나는 추측하려고 노력할 것이다

- 문자열 출력의 길이 , /000이 잊어버린 +1 문자만.

 
Vict :

작동하지 않으면 입력이 빈 문자열입니다. 내 버전은 정확하고 작동하지만 당신의 버전은 아닙니다.

어리석게도 큰 여백으로 버퍼를 덮어쓰면 자연스럽게 원하는 라인도 캡처됩니다.

빈 문자열은 어떻습니까? 소켓에서 문자열이 도착하면 다른 경우에는 곡선이지만 비어 있지 않습니다.
귀하의 버전이 정확하지 않다는 말은 아니지만 귀하의 버전에서는 문자열 배열을 사용하고 있습니다.
제 경우에는 포인터입니다.

 const wchar_t* data = getData();

소켓 함수는 const wchar_t*에 대한 포인터를 반환합니다.
이것이 내가 mql 버그에 죄를 지은 이유입니다. C-S 기능을 시도하지 않았기 때문에 +1 또는 +2의 하드 코어 기능을 사용했기 때문입니다.
그것은 전혀 가지 않는다.

 
Vladimir Simakov :
나는 추측하려고 노력할 것이다

- 문자열 출력의 길이 , /000이 잊어버린 +1 문자만.

당신이 그것을 의미하는 경우

StringInit( out , 201 , 32 );

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

그 줄은 매우 드물게 복사되며 시간에 큰 차이가 있습니다.
이 옵션은 초기에 이미 시도되었으며 몇 페이지를 뒤에서 살펴보고 거기에 스크린샷을 게시했습니다.

여기에서 두 번째 화면과 동일한 동작 , 모더는 어떤 이유로 파일 이름을 krakozyabry로 대체했습니다.

이 함수도 wcscpy( out , data); 문자열의 길이를 자동으로 계산하면 동일한 동작이 발생하여 일시적으로 전체 문자열을 건너뜁니다.