是命令行参数的一些字符串?(Are command line arguments some stri

2019-09-30 04:10发布

我曾问命令行参数类似的问题在C ++中某些小时前。 现在我有一个问题,据我所知,命令行参数将被保存像argv数组中的字符串。 所以用一个字符串比较的主题应该是合乎逻辑的,但它并不在我所希望的方式工作,看看下面的代码:

#include <iostream>
using namespace std;

int main(int argc,char** argv)
{
    if (argv[2]=="stack") cout << "right";
    cout << argv[2];
    return 0;
}

现在我通过这个命令我叫zero.exe编译的应用程序;

zero.exe stack

输出应为“rightstack”,但if命令将跳过并且仅cout << argv[2]; 将执行,所以只有栈将显示器上显示。 它示出了"stack"被保存到argv[2]所以if (argv[2]=="stack")应该工作,但实际上并非如此。 问题出在哪儿?

Answer 1:

由于历史的原因,参数为C风格的字符串传递; 也就是说,每个是指向字符数组,具有零值的字符标记的结束。 类似地,文本(例如字符串"stack" )是字符的简单阵列。

您的代码比较两个三分球,这是不相等的,即使字符串值相等。 为了比较字符串,无论是将一个(或两者) std::string

#include <string>

std::string arg2(argv[2]);
if (arg2=="stack") std::cout << "right\n";

或使用比较C风格字符串中使用C库函数; 这可能是更有效,但也更难阅读:

#include <cstring>

if (std::strcmp(argv[2], "stack") == 0) std::cout << "right\n";

此外,参数从1计算,该程序名称argv[0]所以你可能要被测试argv[1]而不是argv[2]



Answer 2:

问题是, argv[2]是一个不同的 “堆栈”比字符串“堆栈”你在你的程序有。
这是C ++毕竟,在这里,如果你比较两个字符串你的方式,你只是比较他们的地址。

编辑:
在你的榜样, zero.exe stackargv[0]包含了程序名和argv[1]包含“栈”,所以你也关闭的一个。

更多编辑:
我想我看到其中编号混乱来自...如果你在Visual Studio调试器下运行,你可以在项目的属性页输入命令行参数,在这种情况下, zero.exe将成为的argv [1 ]是的。 程序本身的名字将永远是argv中[0]。



文章来源: Are command line arguments some strings?