如何在 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
解决方案
strcasecmp
比 stricmp
更便携
@JaredPar 似乎很奇怪(或者可能是显然每个人似乎都可以通过 boost 来解决任何问题),有人会建议 boost 只是为了进行这样的平凡比较?
第二个例子中缺少一个结束括号。【参考方案3】:
C/C++ 程序中的 argv[] 只是一个由 shell 传入的字符串。您必须将程序中的比较更改为不区分大小写。
【讨论】:
以上是关于如何在 Win32 控制台应用程序中将 argv[] 设置为不区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章
如何在c ++ win32 API中将图标添加到菜单项[重复]