argc是int类型,表示命令行参数个数(含程序名);argv是char**类型,指向字符串数组,argv[argc]为空指针,可作遍历终止条件。
直接用 argc 和 argv 就行,C++ 标准规定 main 函数签名必须支持这两个参数,不需要额外库。
argc 是 int 类型,表示命令行参数个数(包括程序名本身);argv 是 char*[](即 char**),每个元素指向一个以 \0 结尾的 C 风格字符串。注意:argv[argc] 保证为 nullptr,这是标准行为,可安全用作终止条件。
argv[0] 通常是可执行文件路径(但不一定是绝对路径,也不保证可执行——比如用户可能用 ./a.out 或 /tmp/a.out 启动)"hello world"),shell 已将其合并为单个 argv[i] 元素,无需手动拼接最稳妥方式是用 for (int i = 0; i ,别用 while (argv[i])——虽然 argv[argc] == nullptr 是标准保证,但依赖它不如显式用 argc 更清晰、更防手误。
argv[1] 当作第一个“用户参数”,却忘了检查 argc 就直接访问,导致段错
误
if (argc > 2) { use(argv[2]); },而不是 if (argv[2])
argv 指向的字符串存储在只读内存区,不能修改内容(如 argv[1][0] = 'X' 是未定义行为)直接构造 std::string 最简单:std::string s(argv[i]);。需要数字时,优先用 std::stoi / std::stol 等,它们会抛异常(std::invalid_argument 或 std::out_of_range),比 atoi 更安全。
atoi(argv[1]) 对非数字输入返回 0,无法区分 “0” 和 “abc”,且不报错std::stoi(argv[1], nullptr, 10) 可捕获异常,明确知道哪里出错\ 在 C 字符串里要写成 \\,但命令行传入时 shell 不做转义,所以 argv 里就是原样字符没有内置解析器,得自己循环比对。推荐用 std::string_view(C++17 起)避免临时 std::string 构造开销:
for (int i = 1; i < argc; ++i) {
std::string_view arg(argv[i]);
if (arg == "-h" || arg == "--help") {
print_help();
return 0;
} else if (arg == "-v" || arg == "--verbose") {
verbose = true;
} else if (arg.starts_with("-")) {
std::cerr << "Unknown option: " << arg << "\n";
return 1;
}
}
-o file.txt)需手动处理下一个 argv[i+1],记得检查 i+1
-abc)需拆成单个字符处理,arg.substr(1) 再逐字符遍历boost::program_options 或 CLI11,但小工具完全没必要引入依赖真正容易被忽略的是:argv 中的字符串生命周期只在 main 执行期间有效,不能保存 char* 指针长期使用;如果需要缓存,必须复制内容(例如存 std::vector<:string>)。