检查 C++ 中的特定命令行参数
Checking for specific command line arguments in C++
我正在构建一个 CLI 应用程序,它应该执行与此类似的操作:
./app
Welcome to the app, Type -h or --help to learn more.
./app -h
list of commands:...
这是我要构建的代码:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
cout << "Welcome to the app. Type -h or --help to learn more\n";
if(argv == "-h" || argv == "--help") {
cout << "List of commands:...";
}
return 0;
}
但是当我尝试编译 gcc 时出现以下错误:
error: comparison between distinct pointer types ‘char**’ and ‘const char*’ lacks a cast [-fpermissive]
if(argv == "-h" || argv == "--help") {
^~~~
error: comparison between distinct pointer types ‘char**’ and ‘const char*’ lacks a cast [-fpermissive]
if(argv == "-h" || argv == "--help") {
^~~~~~~~
argv 是指向 char* 的指针。
您必须首先选择要访问的 argc 参数。
例如argv[2] 第三个参数。
而且你不能在 char* 上使用 == 进行字符串比较,你必须使用 strcmp,或者从 char * 构造一个字符串对象,如下所示:
字符串 arg2 = argv[2];
然后你可以做 arg2 == "--help"
如果要使用 == 运算符,则需要遍历参数数组并将 char 数组转换为字符串
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv) {
cout << "Welcome to the app. Type -h or --help to learn more\n";
for(int i=0;i<argc;i++)
{
if(string(argv[i]) == "-h" || string(argv[i]) == "--help")
{
cout << "List of commands:...";
}
}
return 0;
}
你不能像比较整数那样比较字符串!!!
使用 strcmp/stricmp
从 C++17 开始,编写此代码的最佳方式如下:
#include <iostream>
#include <string_view>
int main(int argc, char** argv) {
using namespace std::literals;
std::cout << "Welcome to the app. Type -h or --help to learn more\n";
if (argv[0] == "-h"sv || argv[0] == "--help"sv) {
std::cout << "List of commands:...";
}
}
在 string_view
header 存在之前,您可以使用 ""s
std::string
文字,它产生与上面相同的代码,只是包括 string
标准 header 并将 "…"sv
更改为 "…"s
。不幸的是,这样的代码会导致冗余分配,但在这个特定的例子中是无关紧要的。
我正在构建一个 CLI 应用程序,它应该执行与此类似的操作:
./app
Welcome to the app, Type -h or --help to learn more.
./app -h
list of commands:...
这是我要构建的代码:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
cout << "Welcome to the app. Type -h or --help to learn more\n";
if(argv == "-h" || argv == "--help") {
cout << "List of commands:...";
}
return 0;
}
但是当我尝试编译 gcc 时出现以下错误:
error: comparison between distinct pointer types ‘char**’ and ‘const char*’ lacks a cast [-fpermissive]
if(argv == "-h" || argv == "--help") {
^~~~
error: comparison between distinct pointer types ‘char**’ and ‘const char*’ lacks a cast [-fpermissive]
if(argv == "-h" || argv == "--help") {
^~~~~~~~
argv 是指向 char* 的指针。
您必须首先选择要访问的 argc 参数。
例如argv[2] 第三个参数。
而且你不能在 char* 上使用 == 进行字符串比较,你必须使用 strcmp,或者从 char * 构造一个字符串对象,如下所示: 字符串 arg2 = argv[2];
然后你可以做 arg2 == "--help"
如果要使用 == 运算符,则需要遍历参数数组并将 char 数组转换为字符串
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv) {
cout << "Welcome to the app. Type -h or --help to learn more\n";
for(int i=0;i<argc;i++)
{
if(string(argv[i]) == "-h" || string(argv[i]) == "--help")
{
cout << "List of commands:...";
}
}
return 0;
}
你不能像比较整数那样比较字符串!!! 使用 strcmp/stricmp
从 C++17 开始,编写此代码的最佳方式如下:
#include <iostream>
#include <string_view>
int main(int argc, char** argv) {
using namespace std::literals;
std::cout << "Welcome to the app. Type -h or --help to learn more\n";
if (argv[0] == "-h"sv || argv[0] == "--help"sv) {
std::cout << "List of commands:...";
}
}
在 string_view
header 存在之前,您可以使用 ""s
std::string
文字,它产生与上面相同的代码,只是包括 string
标准 header 并将 "…"sv
更改为 "…"s
。不幸的是,这样的代码会导致冗余分配,但在这个特定的例子中是无关紧要的。