Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参数解析错误_C++_Console_Command Line Arguments - Fatal编程技术网

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(并导致控制台仍然为空)是的,但是你是第一个;)你应该使用