如何在 Win32 控制台应用程序中将 argv[] 设置为不区分大小写?

Posted

技术标签:

【中文标题】如何在 Win32 控制台应用程序中将 argv[] 设置为不区分大小写?【英文标题】:How to set the argv[ ] to be case-insensitive in a Win32 Console Application? 【发布时间】:2013-08-13 21:02:22 【问题描述】:

已解决。

原来的问题: 如何让与 argv[] 的比较不区分大小写?这是一个代码片段:

if (std::string(argv[2]) == "HKCU") //Si escriben HKCU

    cout << "Has escrito HKCU" << endl;

else //Si no escriben la clave

    cout << "Debes especificar HCKU o HKLM" << endl;

如果我通过参数“hkcu”测试不起作用,我必须输入“HKCU”。如果我在程序中比较“HKCU”或“hkcu”,任何一个字符串都可以。

编辑:我不得不以这种方式使用 _stricmp(使用 VS2013):

if (_stricmp(argv[2], "HKCU") == 0)

【问题讨论】:

将字符串全部转换为小写... 或者使用C库函数stricompare Case insensitive string comparison C++的可能重复 @RefugnicEternium: stricompare 是非标准的。 比较不区分大小写,而字符串可以小写/大写。因此,您要么使用不区分大小写的函数进行搜索/比较,要么只使用小写/大写大小写字符串并在搜索字符串中使用该大小写。 【参考方案1】:

您需要重新考虑您的问题。您不希望“字符串”不区分大小写,而是希望通过比较意识到 HKCU 与 Hkcu 或 hKcU 相同。

为此,有许多选项,其中之一是已经提到的函数stricmp。 原型是:

#include <string.h>
int stricmp(const char *string1, const char *string2);

意思是,你会这样使用它:

if(stricmp(argv[2], "HKCU") == 0) 

另一个选项是strcasecmp 函数,它的作用类似。

希望这会有所帮助。

【讨论】:

我必须以同样的方式配置 strcasecmp 吗? 知道了。我不得不使用 _stricmp 因为 strcmp 不起作用,并且 stricmp 已被弃用。非常感谢! @Checho 如果您的问题已经解决,请考虑接受帮助您解决问题的答案。谢谢你:)【参考方案2】:

如果boost 是一个选项,那么您可以使用iequals

if (boost::iequals(std::string(argv[2]), "HKCU")) 
  ...

另一种选择是只使用strcasecmp

if (0 == strcasecmp(argv[2], "HKCU"))  
  ...

【讨论】:

为什么要为这么简单的事情提速? @JesusRamos 没有特别的原因,我也添加了stricmp 解决方案 strcasecmpstricmp 更便携 @JaredPar 似乎很奇怪(或者可能是显然每个人似乎都可以通过 boost 来解决任何问题),有人会建议 boost 只是为了进行这样的平凡比较? 第二个例子中缺少一个结束括号。【参考方案3】: C/C++ 程序中的

argv[] 只是一个由 shell 传入的字符串。您必须将程序中的比较更改为不区分大小写。

【讨论】:

以上是关于如何在 Win32 控制台应用程序中将 argv[] 设置为不区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

信号量无法阻止 Win32 控制台应用程序中的线程

错误 C3861:“系统”:未找到标识符

如何在win32 api中将鼠标坐标写入文本文件?

如何在c ++ win32 API中将图标添加到菜单项[重复]

如何使用visual studio 2017编写一个C++程序

win32控制台变服务代码