Я новичок в кодировании на С++, и у меня есть этот код:
std::string user_name = "raso";
// User Name
TCHAR username[UNLEN + 1];
DWORD username_len = UNLEN + 1;
GetUserName((TCHAR*)username, &username_len);
if (user_name == username)
{
std::cout << "You found the user name!";
}
Это дает мне ошибку. По сути, он находит имя пользователя ПК и сравнивает его со строкой user_name
, но user_name
— это тип std::string
, а username
— тип TCHAR*
, верно? Итак, как я могу сравнить оба в утверждении if
?
Обратите внимание, что TCHAR
— это макрос, который расширяется до char
или wchar_t
в зависимости от настроек компиляции. GetUserName
также является макросом, который снова расширяется до GetUserNameA
или GetUserNameW
в зависимости от настроек компиляции. WinAPI поддерживает наборы символов ANSI (кодовая страница) или UNICODE (UTF-16). Учитывая, что это 2023 год, вам следует избегать ANSI и использовать UNICODE; если у вас нет очень веской причины не делать этого.
есть ли способ сделать это в коде?
@CodexSC (TCHAR*)username
-- Никогда не приводить строковые типы. Либо используйте правильный тип строки, либо используйте функцию, которая принимает тип строки, который у вас есть. Если вам нужно привести тип, вам лучше точно знать, что вы делаете. Все, что вы сделали со своим кодом при приведении, это сказали компилятору: «Хватит жаловаться, я знаю, что делаю». Если вы удалили это приведение типов, я уверен, что компилятор выдал вам ошибку — пожалуйста, прочтите выданную вам ошибку, так как она указывает на то, что вы делаете что-то не так. Кроме того, приведение строк не преобразует строки из одного типа в другой.
... Актерский состав все равно лишний.
Не смешивайте широкие и узкие струны.
Если ваше целевое имя std::string
, используйте A
версию API: GetUserNameA
Также не понадобилось приведение типов (TCHAR*)username
.
std::string user_name = "raso";
// User Name
char username[UNLEN + 1];
DWORD username_len = UNLEN;
GetUserNameA(username, &username_len);
if (user_name == username)
{
std::cout << "You found the user name!";
}
Привет! так как я могу редактировать код? можешь показать на коде? извините я немного нуб
О, наконец-то я понял: D Спасибо, сработало!
@CodexSC Если вы хотите использовать TCHAR
, используйте std::basic_string<TCHAR>
вместо std::string
, например: std::basic_string<TCHAR> user_name = TEXT("raso");
Тогда исходный код сработал бы.
TCHAR
— это макрос, который расширяется либо доchar
, либо доwchar_t
. Эти два типа несовместимы.