Ins*_*Man 1 c++ command-line-arguments
几个小时前我在C++中问过类似的关于命令行参数的问题.现在我有另一个问题,据我所知,命令行参数将像argv数组中的字符串一样保存.所以将主题与字符串进行比较应该是合乎逻辑的,但它不能按照我想要的方式工作,看看这段代码:
#include <iostream>
using namespace std;
int main(int argc,char** argv)
{
if (argv[2]=="stack") cout << "right";
cout << argv[2];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我将此命令传递给名为zero.exe的已编译应用程序;
zero.exe stack
Run Code Online (Sandbox Code Playgroud)
输出应该是"rightstack",但if命令将跳过并且只会cout << argv[2];执行,因此只有堆栈将显示在监视器上.它显示"stack"保存argv[2],所以if (argv[2]=="stack")应该工作,但事实并非如此.问题出在哪儿?
由于历史原因,参数作为C风格的字符串传递; 也就是说,每个都是一个指向字符数组的指针,带有一个零值字符来标记结尾.类似地,字符串文字(如"stack")是一个简单的字符数组.
您的代码会比较两个指针,即使字符串值相等也不会相等.要比较字符串,请将一个(或两个)转换为std::string:
#include <string>
std::string arg2(argv[2]);
if (arg2=="stack") std::cout << "right\n";
Run Code Online (Sandbox Code Playgroud)
或使用C库函数比较C风格的字符串; 这可能更有效,但也更难阅读:
#include <cstring>
if (std::strcmp(argv[2], "stack") == 0) std::cout << "right\n";
Run Code Online (Sandbox Code Playgroud)
此外,参数从1开始计算,程序名称为argv[0],因此您可能希望进行测试argv[1]而不是argv[2].