C++ 参数解析错误
我正试图用以下代码解析控制台应用程序中的运行参数:C++ 参数解析错误,c++,console,command-line-arguments,C++,Console,Command Line Arguments,我正试图用以下代码解析控制台应用程序中的运行参数: int _tmain(int argc, _TCHAR* argv[]) { if(argv[1] == _T("arg1")) cout<<"Argument1 was passed"; _getch(); return 0; } int-tmain(int-argc,_-TCHAR*argv[] { 如果(argv[1]===(arg1”))不能用于比较char数组 if(strcmp(argv[1]
int _tmain(int argc, _TCHAR* argv[])
{
if(argv[1] == _T("arg1")) cout<<"Argument1 was passed";
_getch();
return 0;
}
int-tmain(int-argc,_-TCHAR*argv[]
{
如果(argv[1]===(arg1”))不能用于比较char
数组
if(strcmp(argv[1], "arg1") == 0)
if (_tcscmp(argv[1], _T("arg1")) == 0) {
cout << "Argument1 was passed" << endl;
}
使用==
只是比较指向两个不同字符串的指针
参见Darius Kucinskas关于比较数组的回答,如果(\u tcscmp(argv[1],\u T(“arg1”)==0){
if(strcmp(argv[1], "arg1") == 0)
if (_tcscmp(argv[1], _T("arg1")) == 0) {
cout << "Argument1 was passed" << endl;
}
你有几个错误吗
1) 不能使用==运算符比较C样式字符串(字符数组)。argv[#]
是一个字符数组,就像\T(“某些值”)
一样。为了比较它们,需要使用strcmp
(或其近亲之一),或将其存储在std::string
中
2) 您正在尝试访问数组的第2个元素,但只存在1个元素。您说您没有向调用传递任何内容,这意味着argv[0]
将包含数据(您正在运行的可执行文件的名称),但argv[1]
不会。通常,试图访问它将试图访问数组范围之外的数据,但结果未定义。在这种特殊情况下,标准(第3.6.2节)规定它将始终为0(也称为NULL)。因此,您的条件值将始终为false
3) 当需要命令行参数时,应始终检查argc
的值。@Victor我已更新以显示如何比较argv[1]
转换为ascii字符串。Darius Kucinskas的回答指向\u TCHAR
的等效函数,只要他在命令行上实际传入了一些内容,这就行了。如果他只是运行程序(没有命令行参数),行为是未定义的(他试图访问数组的末尾)@ZacHowland我不认为行为是因为这个原因而未定义的。我同意检查argc>1
是必要的,但访问argv[argc]
是定义良好的-返回NULL
。有关详细信息,请参阅details@simonc:正确(第3.6.2节同样说明),但尝试访问数组范围之外的内容仍然是非常糟糕的做法。在这种情况下,如果他继续在命令行上不传递任何内容,他将每次调用strcmp(NULL,“arg1”)==0,这将始终是false(并导致控制台仍然为空)是的,但是你是第一个;)你应该使用