Typecast: LPCTSTR в Char * для операции объединения строк - PullRequest
1 голос
/ 11 августа 2009

Можете ли вы дать решение для этого кода приведения типов, LPCTSTR (здесь lpsubkey) к Char * для фрагмента кода ниже,

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

здесь это делает ошибку нарушения доступа, так что будет решением для этого? ... заранее спасибо

Ответы [ 4 ]

2 голосов
/ 11 августа 2009

В вашем коде есть несколько проблем, которые могут привести к нарушению прав доступа. Я не думаю, что кто-либо имеет какое-либо отношение к упомянутому вами составу.

Вы назначаете указатель на первый элемент массива 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 голос
/ 11 августа 2009

Это не одно и то же. Что ты пытаешься сделать?

Проблема в том, что вы пытаетесь добавить строку, для которой у вас нет зарезервированной памяти. Попробуйте:

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

Будьте осторожны с произвольным размером 1024. Если вы ожидаете, что ваши ключи будут намного длиннее, ваша программа потерпит крах.

Также посмотрите на strcat_s .

0 голосов
/ 11 августа 2009

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 голосов
/ 11 августа 2009

ATL и MFC установили макросы для такого преобразования, где используются следующие буквы:

  • W - широкая строка в Юникоде
  • T - общая строка символов
  • A - строка символов ANSI
  • OLE - строка BSTR,

так что в вашем случае вам нужны макросы T2A

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...