【问题标题】:How to compare a parameter string Visual C++如何比较参数字符串 Visual C++
【发布时间】:2013-03-01 17:55:04
【问题描述】:

我想做一些简单的事情:检查参数是什么。

void _tmain(int argc, WCHAR *argv[])
{



if(argv[4] == "-h");
{

        //do stuff
}


}

我收到从 WCHAR * 到 const char * 的不兼容错误。

有人问过这样的转换问题,但我找到的答案很多,并不简单。我是 C++ 的新手。

我正在寻找的不是指向某些复杂函数的指针,而是要放入我的程序以使其工作的实际代码。

只是在寻找一些简单、直接、有效的代码。谢谢!

【问题讨论】:

标签: c++


【解决方案1】:

这里有两个问题:

  1. 将“指向char 的指针”与字符串对象的逻辑概念混为一谈。在 C(和 C++)中,指向 char (char*) 的指针按照惯例只是 C 样式的字符串。我的意思是,如果您终止它(\0)并使用适当的库方法。因为指向char 的指针不是实际的字符串类型,所以您执行的是指针相等而不是逻辑相等。

  2. 将宽字符 (L"A") 与窄字符 ("A") 混为一谈。这是两个截然不同的概念,可能对您没有帮助。

我建议放弃 Unicode 入口点:

/* do you really want C or C++? */
int main(int argc, char **argv)
{
    /* now we're "narrow" characters, which will be more natural for you */

并改进您的测试(或使用getopt):

    if (0 == strcmp(argv[4], "-h"))
    {
        /* argv[4] is equal to "-h" */

如果你真的想要 C++,你应该使用 std::string 而不是旧的 C 风格的字符串。

【讨论】:

  • 感谢您的见解。他们很有帮助:)
【解决方案2】:
#include <string.h>
void _tmain(int argc, WCHAR *argv[])
{



   if( 0 == wcscmp(argv[4], L"-h") )
   {

        //do stuff
   }


}

应该可以的。

【讨论】:

  • 我接受了这个答案,因为它是最简单的。这里的几个答案也很有效,所以我必须根据其他因素进行选择!谢谢大家!
  • @user1784129 可能是最简单的解决方案,但使用 s.th。像wcscmp() 这样可能会严重破坏代码的可移植性。这不是 C++ 标准...
  • 如果您不了解更大且影响深远的区别,则应避免使用_tmainWCHAR。只会让你头疼。
【解决方案3】:

试试这个:

#include <string>


void _tmain(int argc, WCHAR *argv[])
{
    typedef std::basic_string<WCHAR> string_type;
    static const string_type help( TEXT("-h") );

    if(argv[4] == help);
    {
        //do stuff
    }
...
}

我假设 TEXT 宏仍然存在 - 我已经好几年没有做过任何 windows c++ 编程了。

我还假设 -h 代表“帮助”:)

【讨论】:

    【解决方案4】:

    您无法将 指针 与字符数组(无论是 WCHAR* 还是 char*)进行比较,以检查它们的内容是否相等(它们指向内存中的内容)。

    你可以试试……像这样:

    if(std::wstring(argv[4]) == std::wstring(L"-h")) 
    {
        // ...
    }
    

    【讨论】:

    • 谢谢。对我有帮助:)
    • @user1784129 顺便说一句:您不应该只寻找代码中的工作解决方案(以'gimme teh codez' 方式),而是要获得解释背景原因的答案。工作与否。
    猜你喜欢
    • 2015-11-13
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2016-02-08
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多