c++ - 如何正确调用getopt函数

标签 c++ argv getopt

http://code.google.com/p/darungrim/source/browse/trunk/ExtLib/XGetopt.cpp?r=17 调用 int getopt 函数时出错

`check.cpp: In function ‘int main()’:`

check.cpp:14:55: 错误:从‘const char**’到‘char* const*’的无效转换[-fpermissive]

/usr/include/getopt.h:152:12: 错误:正在初始化“int getopt(int, char* const*, const char*)”的参数 2 [-fpermissive]

#include <iostream>
#include <cstring>
#include <string>
#ifdef USE_UNISTD
#include <unistd.h>
#else
#include "XGetopt.h"
#endif
using namespace std;

int main() {

string text="-f  input.gmn -output.jpg";
int argc=text.length();
cout<<"argc: "<<argc<<endl;
char const * argv = text.c_str();
cout<<"argv: "<<argv<<endl;
int c = getopt (argc, &argv, "f:s:o:pw:h:z:t:d:a:b:?");
cout<<"c: "<<c<<endl;
return 0;
}

最佳答案

你在这里遗漏了两件事:

  1. 参数列表不是字符串。它是一个字符串列表。不要被 shell 或其他要求将参数列表作为单个字符串的程序所迷惑。在一天结束时,这些程序会将字符串拆分为参数数组并运行可执行文件(例如,请参见 execv)。
  2. 在参数列表中总是有一个隐含的第一个参数,它是一个程序名。

这是你的代码,已修复:

#include <string>
#include <iostream>
#include <unistd.h>

int main()
{
    const char *argv[] = { "ProgramNameHere",
                           "-f", "input.gmn", "-output.jpg" };
    int argc = sizeof(argv) / sizeof(argv[0]);
    std::cout << "argc: " << argc << std::endl;
    for (int i = 0; i < argc; ++i)
        std::cout << "argv: "<< argv[i] << std::endl;
    int c;

    while ((c = getopt(argc, (char **)argv, "f:s:o:pw:h:z:t:d:a:b:?")) != -1) {
        std::cout << "Option: " << (char)c;
        if (optarg)
            std::cout << ", argument: " << optarg;
        std::cout << '\n';
    }
}

关于c++ - 如何正确调用getopt函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10502516/

相关文章:

python - 从命令行将字符串中的换行符传递到 python 脚本中

c++ - 在代码中设置 char** argv

C++ 基类列表以及如何确定类类型

c++ - 从数组中查找中间元素

c - argv 在 C 中从控制台输入读取 * 字符时遇到问题

C++如何将argv作为字符串保存到 vector

c - 非全局使用的 getopt (C) 错误?

libraries - 对符号 'BIO_ctrl@@libcrypto.so.10' 的 undefined reference

c++ - 对此 argv 的使用感到困惑

c++ - getopt - 捕获 '?'