C程序帮助使用getopt和命令行参数在Unix/Linux中打开文件

C程序帮助使用getopt和命令行参数在Unix/Linux中打开文件,c,linux,unix,command-line,arguments,C,Linux,Unix,Command Line,Arguments,我正在努力完成我的大学作业,该作业要求在Unix中使用C语言编程。我必须接受命令行参数并打开一个名为作为参数传递的文件。我一直在寻找帮助,但找不到任何资源来帮助我理解如何将参数解析为字符串并打开所需文件。我正在寻找能为我指明正确方向的例子或链接 我将包含一段简短的代码,其中我将尝试使用getopt()解析选项。我做错了什么 #include<stdio.h> #include<sys/types.h> #include<unistd.h> int main

我正在努力完成我的大学作业,该作业要求在Unix中使用C语言编程。我必须接受命令行参数并打开一个名为作为参数传递的文件。我一直在寻找帮助,但找不到任何资源来帮助我理解如何将参数解析为字符串并打开所需文件。我正在寻找能为我指明正确方向的例子或链接

我将包含一段简短的代码,其中我将尝试使用getopt()解析选项。我做错了什么

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>


int main(int argc[], char *argv[])
{
        int option;
        while(option = getopt(argc, argv, "hi:o:") != -1)
        {
                switch (option){
                        case 'h':
                                printf("Usage : -i [input file name]\n-o [output file name]");
                                break;
                        case 'i':
                                printf("\n Input file is: %s",argv[1]);
                                break;
                        case 'o':
                                printf("\n Output file is: %s",argv[2]);
                                break;
                }
        }

return 0;
}
#包括
#包括
#包括
int main(int argc[],char*argv[]
{
int选项;
while(option=getopt(argc,argv,“hi:o:”)!=-1)
{
开关(选件){
案例“h”:
printf(“用法:-i[输入文件名]\n-o[输出文件名]”;
打破
案例“i”:
printf(“\n输入文件为:%s”,argv[1]);
打破
案例“o”:
printf(“\n输出文件为:%s”,argv[2]);
打破
}
}
返回0;
}
我一直收到“无法识别的命令行选项错误”。另外,当我试图包含一个文本文件时,我相信错误表明选项被解析为int,但参数是字符串


我不是真的想在这里得到任何直接的答案。我希望社区帮助我以最好的方式学习。

如评论中所述,您应该使用
optarg
。下面是一个非常全面的示例:

/*
    example of command line parsing via getopt
    usage: getopt [-dmp] -f fname [-s sname] name [name ...]

    Paul Krzyzanowski
*/

#include <stdio.h>
#include <stdlib.h>

int debug = 0;

int
main(int argc, char **argv)
{
    extern char *optarg;
    extern int optind;
    int c, err = 0; 
    int mflag=0, pflag=0, fflag=0;
    char *sname = "default_sname", *fname;
    static char usage[] = "usage: %s [-dmp] -f fname [-s sname] name [name ...]\n";

    while ((c = getopt(argc, argv, "df:mps:")) != -1)
        switch (c) {
        case 'd':
            debug = 1;
            break;
        case 'm':
            mflag = 1;
            break;
        case 'p':
            pflag = 1;
            break;
        case 'f':
            fflag = 1;
            fname = optarg;
            break;
        case 's':
            sname = optarg;
            break;
        case '?':
            err = 1;
            break;
        }
    if (fflag == 0) {   /* -f was mandatory */
        fprintf(stderr, "%s: missing -f option\n", argv[0]);
        fprintf(stderr, usage, argv[0]);
        exit(1);
    } else if ((optind+1) > argc) { 
        /* need at least one argument (change +1 to +2 for two, etc. as needeed) */

        printf("optind = %d, argc=%d\n", optind, argc);
        fprintf(stderr, "%s: missing name\n", argv[0]);
        fprintf(stderr, usage, argv[0]);
        exit(1);
    } else if (err) {
        fprintf(stderr, usage, argv[0]);
        exit(1);
    }
    /* see what we have */
    printf("debug = %d\n", debug);
    printf("pflag = %d\n", pflag);
    printf("mflag = %d\n", mflag);
    printf("fname = \"%s\"\n", fname);
    printf("sname = \"%s\"\n", sname);

    if (optind < argc)  /* these are the arguments after the command-line options */
        for (; optind < argc; optind++)
            printf("argument: \"%s\"\n", argv[optind]);
    else {
        printf("no arguments left to process\n");
    }
    exit(0);
}
/*
通过getopt进行命令行解析的示例
用法:getopt[-dmp]-f fname[-s sname]name[名称…]
保罗·克兹扎诺夫斯基
*/
#包括
#包括
int-debug=0;
int
主(内部argc,字符**argv)
{
外部字符*optarg;
外部-内部选项;
int c,err=0;
int mflag=0,pflag=0,fflag=0;
char*sname=“default\u sname”,*fname;
静态字符用法[]=“用法:%s[-dmp]-f fname[-s sname]name[name…]\n”;
而((c=getopt(argc,argv,“df:mps:”)!=-1)
开关(c){
案例“d”:
调试=1;
打破
案例“m”:
mflag=1;
打破
案例“p”:
pflag=1;
打破
案例“f”:
fflag=1;
fname=optarg;
打破
案例s:
sname=optarg;
打破
案例“?”:
误差=1;
打破
}
如果(fflag==0){/*-f是必需的*/
fprintf(stderr,“%s:缺少-f选项,\n”,argv[0]);
fprintf(标准,用法,argv[0]);
出口(1);
}如果((optind+1)>argc){
/*至少需要一个参数(将两个参数的+1更改为+2,视需要而定)*/
printf(“optind=%d,argc=%d\n”,optind,argc);
fprintf(stderr,“%s:缺少名称\n”,argv[0]);
fprintf(标准,用法,argv[0]);
出口(1);
}否则如果(错误){
fprintf(标准,用法,argv[0]);
出口(1);
}
/*看看我们有什么*/
printf(“调试=%d\n”,调试);
printf(“pflag=%d\n”,pflag);
printf(“mflag=%d\n”,mflag);
printf(“fname=\%s\”\n,fname);
printf(“sname=\%s\”\n,sname);
if(optind

此示例提供了更多信息。

如果要使用
getopt
,则不应在
开关
块中直接使用
argv
。相反,您应该使用
optarg
。还应该显式显示您输入的命令。@MikeHolt这是什么意思?很抱歉,我不明白。@PManojMJ如果您发现任何有帮助的答案(回答了您的问题),通常在StackOverflow上接受答案或投票表决。@Chimera我很抱歉。我正忙着做我的工作。我现在做了。谢谢你提醒我。坚持下去,伙计。干杯谢谢你的资源。我会仔细检查并发布更新。