Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typecast:LPCTSTR到Char*用于字符串连接操作_C_String_Casting - Fatal编程技术网

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

Typecast:LPCTSTR到Char*用于字符串连接操作,c,string,casting,C,String,Casting,你能给出这个类型转换代码的解决方案吗,LPCTSTR(这里是lpsubkey)到Char* 对于下面的代码片段 char* s="HKEY_CURRENT_USER\\"; strcat(s,(char*)lpSubKey); printf("%S",s); 在这里它会导致访问冲突错误,那么解决方法是什么呢?。 …提前谢谢这不是一回事。你想干什么 问题是您正试图附加到尚未为其保留内存的字符串。 尝试: 请注意1024的任意大小。如果您希望密钥更长,您的程序将崩溃 另外,请看。ATL和MFC已

你能给出这个类型转换代码的解决方案吗,LPCTSTR(这里是lpsubkey)到Char* 对于下面的代码片段

char* s="HKEY_CURRENT_USER\\";
strcat(s,(char*)lpSubKey); 
printf("%S",s);
在这里它会导致访问冲突错误,那么解决方法是什么呢?。
…提前谢谢

这不是一回事。你想干什么

问题是您正试图附加到尚未为其保留内存的字符串。 尝试:

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


另外,请看。

ATL和MFC已将一组宏用于此类转换,其中使用了以下字母:

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

因此,在您的情况下,您需要T2A宏

代码中有几个问题可能会导致访问冲突。我认为这与你提到的演员阵容无关

您正在将一个指向固定大小字符数组的第一个元素的指针分配给一个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等函数来确保您不会将超过缓冲区容量的数据复制到缓冲区中。

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);
}

char*s=“HKEY\U当前用户\\”;strcat(s,(char*)lpSubKey);printf(“%S”,S);这里的lpSubKey是LPCTSTR字符串变量。现在你能解释一下我被问到的问题的解决方案吗?…我想,如果我只对五个字符使用“s”,那么剩余的位置在我的程序中是浪费的。它正确与否?是的,你是正确的。如果这是一个问题,请查看Plinth的解决方案,该解决方案将动态调整缓冲区的大小,使其达到精确长度-------------------这是因为您没有为串联结果分配足够的空间。下面提到这个问题的答案应该对您有所帮助。我无法继续您的代码,错误生成“T2A标识符未找到”,我的程序是否需要任何标题?我指的是Dewfy提到的T2A宏。它们是ATL和MFC的一部分,因此您需要包含适当的头文件。非常感谢您…它也可以工作,我可以理解…那里发生了什么过程。。。
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);
}