잡학다식/코딩 공부

[MFC]CString ->char 배열로 변환

아잇쿠 2022. 10. 27. 09:04
반응형

 

CString ->char 배열로 변환

 

CString str = _T("test");
CStringA strA = CStringA(str);
int len = str.Getlength();


char cArray[ len ] = {0x00, };
memcpy(cArray, strA.GetBuffer(), strA.GetLength());

 

--------------------------

 

CString => const char*
CString strTest = _T("test");
const char* cTest;
cTest = (CStringA)strTest;

 

---------------------------

const char* -> CString
const char* cTest = "test";
CString strTest;
strTest = (CString)cTest;

 

	CString str = _T("test");
	CStringA strA = CStringA(str);


	char cArray[80] = { 0x00, };
	memcpy(cArray, strA.GetBuffer(), strA.GetLength());

		
	str = (CString)cArray;
	GetDlgItem(IDC_ST_LOG)->SetWindowTextW(str);
	
	str = (CString)cArray[0];
	
	AfxMessageBox(str);

 

 

 

 

문자열 길이에 대한 정보

#include<string.h>
#include<stdio.h> 

int main(void)
{    
    char src[] = "BlockDMask";
    char dest1[] = "abcdefghijklmnop";
    char dest2[] = "abcdefghijklmnop";// 메모리 복사1 : src 길이만큼만 복사
    memcpy(dest1, src, sizeof(char) * 10);     // 메모리 복사2 : src 길이 + 1 만큼 복사
    memcpy(dest2, src, sizeof(char) * 10 + 1);     // source    
    printf("src  : %s\n", src);        // destination    
    printf("dest1 : %s\n", dest1);    
    printf("dest2 : %s\n", dest2);     
    return 0;
}

결과를 보면 알 수 있듯이 C언어 스타일의 문자열(char*)을 전체 복사할때는 길이 + 1을 해주어야 합니다.
이미 다들 알고 있듯

const char* src = "BlockDMask"; 이것은 문자열의 끝에 문자열의 끝을 알리는 '\0'이 있기 때문에 이것까지 복사를 해주어야 딱 src 만큼 복사가 가능합니다.

그렇기 때문에 dest1는 "BlockDMask"까지만 복사 되어서 dest1이 "BlockDMaskklmnop" 가 되었고

dest2는 "BlockDMask\0" 까지 복사 되었기 때문에 "BlockDMask\0klmnop"가 되어서 출력할때는 앞에서부터 쭉 출력하다가 문자열의 끝을 알리는 '\0'를 만났기 때문에 "BlockDMask" 여기까지만 출력하게 된 것 입니다.

추가적으로 dest1과 dest2를 제대로 적으면
dest1 : "BlockDMaskklmnop\0"
dest2 : "BlockDMask\0klmnop\0"
이렇게 되겟죠?

프로그래머가 의도적으로 '\0'을 빼고 복사하려면 "sizeof(char) * 배열길이" 만큼만 복사하면 되고
'\0' 까지 복사를 하려면 "sizeof(char) * 배열길이 + 1" 까지 해주어야 합니다.

 

 

 

[C언어/C++] memcpy 메모리 복사 함수 설명 및 예시

안녕하세요. BlockDMask 입니다. 오늘은 C언어, C++에서 메모리를 복사하는 함수 memcpy 함수에 대해서 한번 알아보려 합니다. 지난시간에는 메모리를 초기화 하는 memset에 대해서 배웠던거 기억하시

blockdmask.tistory.com

 

end.

728x90