首页
学习
活动
专区
圈层
工具
发布

玩getopt
EN

Stack Overflow用户
提问于 2018-04-10 17:39:08
回答 2查看 449关注 0票数 1

嗨,我对编码很陌生,并试图找出为什么这个getopt不起作用。我的编译器抱怨"i:o:“

错误C2664 'int (int,char **,char *):无法将参数3从“const 5”转换为“char *”

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    int opt;
    while ((opt = getopt(argc, argv, "i:o:")) != -1)
    {
        switch (opt)
        {
        case 'i':
            printf("Input file: \"%s\"\n", optarg);
            break;
        case 'o':
            printf("Output file: \"%s\"\n", optarg);
            break;
        }
    }
    return 0;
}    

这很奇怪,因为当我读到getopt时,我看到了“options参数是一个字符串,它指定了对这个程序有效的选项字符”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-10 17:49:54

根据您的错误消息,getopt函数需要一个可写选项字符串。您可以通过这样的非const字符数组来做到这一点:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    // non-const char array
    char opts[] = "i:o:"; // copy a string literal in

    int opt;
    while ((opt = getopt(argc, argv, opts)) != -1)
    {
        switch (opt)
        {
        case 'i':
            printf("Input file: \"%s\"\n", optarg);
            break;
        case 'o':
            printf("Output file: \"%s\"\n", optarg);
            break;
        }
    }
    return 0;
}

您的原始代码在LinuxGCC v7上运行得很好。您使用的版本的函数签名似乎不同。

my系统上,它是:

代码语言:javascript
复制
int getopt (int argc, char** argv, const char* options);

但在你的系统中,它似乎是:

代码语言:javascript
复制
int getopt(int,char **,char *);

在最后一个参数上缺少const会导致错误,这就是为什么您需要给它一个非const字符串。

注意:--我不建议在这方面使用const_cast,因为有些人可能会被诱惑。您永远不知道函数是如何实现的,也不知道该内部实现是否会在某一时刻发生变化。

票数 4
EN

Stack Overflow用户

发布于 2018-04-10 17:41:14

只需使用字符串指针:

代码语言:javascript
复制
char* opts = "i:o:";
getopt(argc, argv, opts);
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49759879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档