Typecast:LPCTSTR到Char *用于字符串连接操作

时间:2009-08-11 12:21:46

标签: c string casting

你可以为这个类型转换代码提供解决方案,LPCTSTR(这里是lpsubkey)给Char * 对于以下代码段,

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

这里会出现访问冲突错误,那么解决方案是什么? ...提前谢谢

4 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,可能会导致访问冲突。我认为与你提到的演员没有任何关系。

您正在将指向固定大小char数组的第一个元素的指针指定给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等函数来确保您不会将更多数据复制到缓冲区中而不是缓冲区可以容纳的数据。

答案 1 :(得分:1)

这些不是一回事。你想做什么?

问题是你试图附加到你没有为内存保留的字符串。 尝试:

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

请小心使用任意大小的1024.如果您希望您的密钥更长,程序将崩溃。

另外,请查看strcat_s

答案 2 :(得分:0)

ATL和MFC为这种转换设置了一组宏,使用下一个字母:

  • W - 宽unicode字符串
  • T - 通用字符串
  • A - ANSI字符串
  • OLE - BSTR字符串,

所以在你的情况下你需要T2A宏

答案 3 :(得分: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);
}