This question already has answers here:
How do I properly compare strings?
(8个答案)
4年前关闭。
我正在学习使用C / C ++进行win32编程。在学习过程中,老师希望我编写一个简单的程序,该程序可以显示它在其上运行的计算机的名称,然后,如果目标计算机的名称为“ USER”,则在输出控制台中显示警告。我编写了以下代码,但是它不起作用。
myFunction代码:
调用代码:
我该如何解决这个问题?
(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
)是另一个等待发生的错误。如果在这种情况下代码无法在没有强制转换的情况下编译,则意味着您正在使用不兼容的类型(char
与wchar_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