Как сравнить std::string и TCHAR* в операторе if?

Я новичок в кодировании на С++, и у меня есть этот код:

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. Эти два типа несовместимы.
Some programmer dude 19.02.2023 21:53

Обратите внимание, что TCHAR — это макрос, который расширяется до char или wchar_t в зависимости от настроек компиляции. GetUserName также является макросом, который снова расширяется до GetUserNameA или GetUserNameW в зависимости от настроек компиляции. WinAPI поддерживает наборы символов ANSI (кодовая страница) или UNICODE (UTF-16). Учитывая, что это 2023 год, вам следует избегать ANSI и использовать UNICODE; если у вас нет очень веской причины не делать этого.

Richard Critten 19.02.2023 21:53

есть ли способ сделать это в коде?

CodexSC 19.02.2023 22:11

@CodexSC (TCHAR*)username -- Никогда не приводить строковые типы. Либо используйте правильный тип строки, либо используйте функцию, которая принимает тип строки, который у вас есть. Если вам нужно привести тип, вам лучше точно знать, что вы делаете. Все, что вы сделали со своим кодом при приведении, это сказали компилятору: «Хватит жаловаться, я знаю, что делаю». Если вы удалили это приведение типов, я уверен, что компилятор выдал вам ошибку — пожалуйста, прочтите выданную вам ошибку, так как она указывает на то, что вы делаете что-то не так. Кроме того, приведение строк не преобразует строки из одного типа в другой.

PaulMcKenzie 19.02.2023 22:27

... Актерский состав все равно лишний.

Paul Sanders 19.02.2023 23:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не смешивайте широкие и узкие струны.

Если ваше целевое имя 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!";
}

Привет! так как я могу редактировать код? можешь показать на коде? извините я немного нуб

CodexSC 19.02.2023 21:53

О, наконец-то я понял: D Спасибо, сработало!

CodexSC 19.02.2023 22:20

@CodexSC Если вы хотите использовать TCHAR, используйте std::basic_string<TCHAR> вместо std::string, например: std::basic_string<TCHAR> user_name = TEXT("raso"); Тогда исходный код сработал бы.

Remy Lebeau 20.02.2023 01:22

Другие вопросы по теме