2009-08-11 1 views
1

이 유 타입 캐스팅이 코드에 대한 솔루션을 제공 할 수 있습니다 문자열 CONCATENATE 작업에 숯불 *에 LPCTSTR는 (여기 lpsubkey) LPCTSTR은 코드 아래에 * ,캐스트 :

여기
char* s="HKEY_CURRENT_USER\\"; 
strcat(s,(char*)lpSubKey); 
printf("%S",s); 

은 액세스 오류를 만드는을 CHAR하기 위반, 그래서 그 해결책은 무엇입니까?. ... 미리 감사드립니다.

+0

라인 충돌? – sharptooth

+0

strcat (s, ** (char *) lpSubKey **); ------------------- – Rajakumar

+0

연결 결과에 충분한 공간을 할당하지 않았기 때문입니다. 이 문제를 언급하는 질문에 대한 답변 아래에서 도움이 될 것입니다. – sharptooth

답변

1

이들은 서로 다릅니다. 너 뭐하려고?

문제는 메모리를 예약하지 않은 문자열에 추가하려고하는 것입니다. 보십시오 : 당신이 당신의 키가 더 이상 프로그램이 충돌 할 것으로 예상되는 경우

char s[1024] = "HKEY_CURRENT_USER"; 
strcat(s,(char*)lpSubKey); 
printf("%S",s); 

1024의 임의의 크기에주의 마십시오.

또한 strcat_s을 살펴보십시오.

+0

char * s = "HKEY_CURRENT_USER \\"; strcat (s, (char *) lpSubKey); printf ("% S", s); 여기 lpSubKey는 LPCTSTR 문자열 변수입니다. 지금 내가 묻는 것에 대한 해답을 설명 할 수 있습니까? ... – Rajakumar

+0

5 문자 만 사용하면 '내'가 '내'프로그램에 낭비된다는 뜻입니다. . 올바른지 아닌지? – Rajakumar

+0

네, 맞습니다. 이것이 문제라면, 정확한 길이로 버퍼 크기를 동적으로 조정할 플 린츠의 해결책을 살펴보십시오. – DanDan

0

ATL 및 MFC는 다음 문자 사용 등의 변환에 매크로의 설정했습니다

  • W를 - 전체 유니 코드 문자열
  • T - 일반 문자열
  • A - ANSI 문자열
  • OLE - BSTR 문자열,

귀하의 경우에는 T2A 매크로가 필요합니다.

2

코드에 액세스 위반이 발생할 수있는 몇 가지 문제가 있습니다. 네가 언급 한 던지기와 아무 관계가 없다고 나는 생각하지 않는다.

고정 크기 문자 배열의 첫 번째 요소에 대한 포인터를 char *에 할당하고 strcat를 사용하여 추가하려고 시도합니다. 암시 적으로 할당 된 문자열 배열에 추가 공간이 없으므로이 오류가 발생합니다. 결과 문자열을 저장할만큼 큰 버퍼를 할당 한 다음 strcat를 호출하기 전에 거기에 문자열 상수를 복사해야합니다. 예를 들면 다음과 같습니다 :

char *s = (char*)malloc(1024 * sizeof(char)); 
strcpy(s, "HKEY_CURRENT_USER\\"); 
strcat(s, T2A(lpSubKey)); 
printf("%s", s); 
free(s); 

위의 할당하는 고정 크기 배열은 나쁜 습관입니다. 프로덕션 코드에서는 항상 버퍼 오버 플로우를 방지하기 위해 이동 중에 배열의 올바른 크기를 결정하거나 strncat 및 strncpy와 같은 함수를 사용하여 버퍼가 보유 할 수있는 것보다 많은 데이터를 버퍼에 복사하지 않도록해야합니다.

+0

코드를 진행할 수 없습니다. "T2A 식별자를 찾을 수 없습니다."라는 오류 메시지가 나타납니다. 내 프로그램에 헤더가 필요합니까? – Rajakumar

+0

내가 언급 한 T2A 매크로는 Dewfy가 언급 한 매크로입니다. 그들은 ATL과 MFC의 일부이므로 적절한 헤더 파일을 포함시켜야합니다. –

0

strcat는 조합을위한 공간을 확보하려고 시도하지 않습니다. 문자열의 일부가 아닌 메모리를 덮어 쓰고 있습니다. 내 머리 위로 떨어져 :

char *strcat_with_alloc(char *s1, char *s2) 
{ 
    if (!s1 || !s2) return NULL; 

    size_t len1 = strlen(s1); 
    size_t len2 = strlen(s2); 

    char *dest = (char *)malloc(len1 + len2 + 1); 
    if (!dest) return NULL; 

    strcpy(dest, s1); 
    strcat(dest, s2); 

    return dest; 
} 

지금 시도 :

char* s="HKEY_CURRENT_USER\\"; 
char *fullKey = strcat_with_alloc(s,(char*)lpSubKey); 
if (!fullKey) 
    printf("error no memory"); 
else { 
    printf("%S",fullKey); 
    free(fullKey); 
} 
+0

당신에게 많이 감사드립니다 .... 그것은 또한 내가 이해할 수있는 작품입니다 .. 거기서 일어나는 과정은 ... – Rajakumar