This question already has answers here:
How do I properly compare strings?
                                
                                    (8个答案)
                                
                        
                                4年前关闭。
            
                    
我正在学习使用C / C ++进行win32编程。在学习过程中,老师希望我编写一个简单的程序,该程序可以显示它在其上运行的计算机的名称,然后,如果目标计算机的名称为“ USER”,则在输出控制台中显示警告。我编写了以下代码,但是它不起作用。

myFunction代码:

tchar * getComputerName() {
        bufCharCount = INFO_BUFFER_SIZE;
        if (!GetComputerName(infoBuf, &bufCharCount))
            printError(TEXT("GetComputerName"));
        return (TCHAR*)infoBuf;
    }


调用代码:

if (getComputerName() == (TCHAR*)"USER") {
            printf("Target OS Detected \n");
        }


我该如何解决这个问题?

最佳答案

发布的代码存在多个问题。最公然的是使用TCHAR。在Win9x具有Unicode支持之前,发明了TCHAR,目的是使代码源代码在Win9x和Windows NT之间保持兼容(后者在整个过程中都使用Unicode和UTF-16LE)。今天,根本没有理由使用TCHAR。只需使用wchar_t,并且Windows API调用带有W后缀。

C样式转换(例如return (TCHAR*)infoBuf)是另一个等待发生的错误。如果在这种情况下代码无法在没有强制转换的情况下编译,则意味着您正在使用不兼容的类型(charwchar_t)。

另外,还有一个逻辑错误:使用C样式的字符串(通过指向以零结尾的字符的指针表示)时,不能使用operator==比较字符串内容。它将改为比较指针。解决方案是调用显式字符串比较(strcmp),或改用C ++ string。后者使operator==重载以执行区分大小写的字符串比较。

固定版本可能如下所示:

#include <windows.h>
#include <string>
#include <iostream>
#include <stdexcept>

std::wstring getComputerName() {
    wchar_t buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0};
    DWORD cchBufferSize = sizeof(buffer) / sizeof(buffer[0]);
    if (!GetComputerNameW(buffer, &cchBufferSize))
        throw std::runtime_error("GetComputerName() failed.");
    return std::wstring(&buffer[0]);
}

int main() {
    const std::wstring compName = getComputerName();
    if ( compName == L"USER" ) {
        std::wcout << L"Print your message" << std::endl;
    }
}

关于c++ - 检索计算机的名称并将其保存在变量中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33282680/

10-11 00:48