Приведение типов: LPCTSTR в Char * для операции объединения строк

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

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

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


person Rajakumar    schedule 11.08.2009    source источник
comment
strcat (s, (char *) lpSubKey); -------------------   -  person Rajakumar    schedule 11.08.2009
comment
Это потому, что вы не выделили достаточно места для результата конкатенации. Ниже приведены ответы на вопрос, касающийся этой проблемы.   -  person sharptooth    schedule 11.08.2009


Ответы (4)


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

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

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

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

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

person DanDan    schedule 11.08.2009
comment
char * s = HKEY_CURRENT_USER \\; strcat (s, (char *) lpSubKey); printf (% S, s); здесь lpSubKey - это строковая переменная LPCTSTR. Теперь вы можете объяснить решение того, о чем меня спрашивают? ... - person Rajakumar; 11.08.2009
comment
Я думаю, что если предположить, что я использую 's' только для пяти символов, то оставшиеся места в моей программе будут пустой тратой .. это правильно или нет? - person Rajakumar; 11.08.2009
comment
Да вы правы. Если это проблема, посмотрите на решение Plinth, которое динамически изменяет размер буфера до точной длины. - person DanDan; 11.08.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, чтобы гарантировать, что вы не копируете в буфер больше данных, чем буфер может вместить.

person Timo Geusch    schedule 11.08.2009
comment
Я не могу продолжить работу с вашим кодом, ошибка генерации идентификатора T2A не найдена, может ли мне понадобиться какой-либо заголовок в моей программе? - person Rajakumar; 11.08.2009
comment
Макрос T2A, о котором я говорил, - это тот самый макрос, о котором упоминала Dewfy. Они являются частью ATL и MFC, поэтому вам необходимо включить соответствующие файлы заголовков. - person Timo Geusch; 11.08.2009

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

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

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

person Dewfy    schedule 11.08.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);
}
person plinth    schedule 11.08.2009
comment
Большое вам спасибо .... это работает, я могу понять .. что за процесс там происходит ... - person Rajakumar; 11.08.2009