高手求教!!!c语言中怎样读取命令行参数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高手求教!!!c语言中怎样读取命令行参数?相关的知识,希望对你有一定的参考价值。

譬如说在liunx下 编写了一个find命令(类似于find(1))
定义了-uid,-mtime,-print等几个options

怎样读取后面的option这一个命令(编写程序的话)
ps:可以用getopt()这一个函数来写么?如果写得话能否举个例子
还有,这里的option算不算命令行参数...?

把main函数声明为int main(int argc,char *argv[])
argc 是参数的个数
如:
int main(int argc,char *argv[])

printf("%s",argv[1]);

这是一个简单的未做错误判断的echo函数,将上面的源程序编译连接为echo.exe,然后在命令提示符下输入echo hello
这样,argc=2,argv[0]为echo,argv[1]为hello

我没用过linux,不知道上面的回答有没有对上意思。
参考技术A 把main的参数声明为(int argc, char*argv[])
argc是参数个数 (不加任何参数运行的时候此值为1)
argv是参数的字符串数组 (argv[0]里面是你运行时执行的命令 比如“find”)

linux是按照空格分隔命令的 你可以循环处理每一个argv

你可以用不同的命令行调用下面的程序看看执行结果就明白了
int main(int argc, char* argv[])

int i;
for (i=0; i<argc; i++)
printf("ARGV[%d]:%s\n", i, argv[i]);
return 0;
参考技术B 在实际程序之中我们经常要对命令行参数进行分析. 比如我们有一个程序a可以接受许多参数.一个可能的情况是
a -d print --option1 hello --option2 world
那么我们如何对这个命令的参数进行分析了?.经常用函数是getopt和getopt_long.
#include <unistd.h>
#include <getopt.h>

int getopt(int argc,char const **argv, const char *optstring);
int getopt_long(int argc,char const **argc,
const char *optstring,const struct option *longopts,
int *longindex);

extern char *optarg;
extern int optind,opterr,optopt;

struct option
char *name;
int has_flag;
int *flag;
int value;
;

getopt_long是getopt的扩展.getopt接受的命令行参数只可以是以(-)开头,而getopt_long还可以接受(--)开头的参 数.一般以(-)开头的参数的标志只有一个字母,而以(--)开头的参数可以是一个字符串.如上面的 -d,--option1选项.
argc,和argv参数是main函数的参数.optstring指出了我们可以接受的参数.其一般的形式为:参数1[:]参数2[:].... 其中参数是我们可以接受的参数,如果后面的冒号没有省略,那么表示这个参数出现时后面必需要带参数值. 比如一个optstring为abc:d:表示这个参数选项可以为a,b,c,d其中c,d出现时候必须要有参数值.如果我们输入了一个我们没有提供的参 数选项.系统将会说 不认识的 选项. getopt返回我们指定的参数选项.同时将参数值保存在optarg中,如果已经分析完成所有的参数函数返回-1.这个时候optind指出非可选参数 的开始位置.

#include <stdio.h>
#include <unistd.h>

int main(int argc,char **argv)

int is_a,is_b,is_c,is_d,i;
char *a_value,*b_value,*c_value,temp;

is_a=is_b=is_c=is_d=0;
a_value=b_value=c_value=NULL;

if(argc==1)

fprintf(stderr,"Usage:%s [-a value] [-b value] [-c value] [-d] arglist ...\n",
argv[0]);
exit(1);


while((temp=getopt(argc,argv,"a:b:c:d"))!=-1)

switch (temp)

case 'a':
is_a=1;
a_value=optarg;
break;
case 'b':
is_b=1;
b_value=optarg;
break;
case 'c':
is_c=1;
c_value=optarg;
break;
case 'd':
is_d=1;
break;



printf("Option has a:%s with value:%s\n",is_a?"YES":"NO",a_value);
printf("Option has b:%s with value:%s\n",is_b?"YES":"NO",b_value);
printf("Option has c:%s with value:%s\n",is_c?"YES":"NO",c_value);
printf("OPtion has d:%s\n",is_d?"YES":"NO");
i=optind;
while(argv[i]) printf(" with arg:%s\n",argv[i++]);
exit(0);


getopt_long比getopt复杂一点,不过用途要比getopt广泛.struct option 指出我们可以接受的附加参数选项.
name:指出长选项的名称(如我们的option1)
has_flag:为0时表示没有参数值,当为1的时候表明这个参数选项要接受一个参数值.为2时表示参数值可以有也可以没有.
指出函数的返回值.如果为NULL,那么返回val,否则返回0.并将longindex赋值为选项所在数组(longopts)的位置.

/* 这个实例是从 GNU Libc 手册上看到的 */

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

int main (int argc, char **argv)

int c;

while (1)

struct option long_options[] =

"add", 1, 0, 0,
"append", 0, 0, 0,
"delete", 1, 0, 0,
/* 返回字符c,等同于 -c 选项 */
"create", 0, 0, 'c',
"file", 1, 0, 0,
/* 数组结束 */
0, 0, 0, 0
;
/* getopt_long stores the option index here. */
int option_index = 0;

c = getopt_long (argc, argv, "abc:d:",
long_options, &option_index);

/* Detect the end of the options. */
if (c == -1)
break;

switch (c)

case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s\n", optarg);
break;

case 'a':
puts ("option -a\n");
break;

case 'b':
puts ("option -b\n");
break;

/* 可能是-c --creat参数指出来的 */
case 'c':
printf ("option -c with value `%s'\n", optarg);
break;

case 'd':
printf ("option -d with value `%s'\n", optarg);
break;



exit (0);


不知道是不是LZ想要的本回答被提问者采纳

C语言求助:如何将.txt文件中的字符串存入字符数组?这个 .txt 文件是从命令行参数 btw 中读取的。

【中文标题】C语言求助:如何将.txt文件中的字符串存入字符数组?这个 .txt 文件是从命令行参数 btw 中读取的。【英文标题】:C language help:How to store strings from a .txt file into a character array? This .txt file is read from a command line argument btw. 【发布时间】:2017-02-07 04:55:15 【问题描述】:

我需要创建一个程序,该程序将使用命令行参数读取 .txt 文件,然后加密该 txt 文件中的消息。

我用指针打开txt文件,打开成功。但我需要将消息(由许多段落组成)存储到单个字符数组中,以便我可以开始加密。

例如,如果消息是:我爱狗

我想将该消息存储到一个字符数组中,例如:

 char word[5000];
 char word[0] = I;
 char word[1] = l;
 char word[2] = o;
 etc....

我尝试使用 for 循环将消息存储到单个字符数组中,但是当我尝试打印出该数组时,它没有显示在我的命令行中。

如何将 .txt 文件中的消息存储到单个字符数组中?

这是我的代码:

int main(int argc, char*argv[])

int a;
printf("The number of arguements is :%d \n", argc);

for(a=0; a<argc; a++)

        printf("argc %d is %s \n",a, argv[a]);

//本节使用文件指针从文本文件中读取,然后显示出来

printf("\n");
char * fname= argv[1];
FILE *fptr= fopen(fname, "r");
char word[5000];
int c;
if (fptr==0)
    
        printf("Could not open file\n");
    else
        
            printf("FILE opened successfully \n");

        

while (fgets(word, 5000, fptr) !=NULL)

    printf("%s \n", word);



fclose(fptr);

【问题讨论】:

您的代码对我有用...我假设此代码 sn-p 中缺少的实际代码中有一个 #include &lt;stdio.h&gt;。这是我做的唯一一件我在这里看不到的事情。 【参考方案1】:

您的 while 循环使用 fgets,旨在逐行读取。如果您想要一个表示文件字节的字符数组,请使用 fread。首先你需要知道文件有多大;为此使用 stat 或 fstat 。

 #include <stat.h>
 struct stat statbuf;
 int FS;
 char* buffer
 if (fstat(fileno(fptr),&statbuf))
    ... handle error
 
 FS = statbuf.st_size;

然后,对于现在在 FS 中的文件大小,分配一些字节

 buffer = (char*) malloc(FS)

然后阅读内容

 fread(buffer, 1, FS, fptr)

【讨论】:

次要:为什么使用int 代替FS.st_sizeoff_t 类型,fread 期望 size_t

以上是关于高手求教!!!c语言中怎样读取命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

Fluent高手求教,UDF编写程序,提取一个流场出口个各个参数,然后加载在另一个流场作为入口条件

如何将命令行参数传递给 c 程序

C语言求助:如何将.txt文件中的字符串存入字符数组?这个 .txt 文件是从命令行参数 btw 中读取的。

进程环境详解---getenvputenv和setenv函数详解

scrapy 怎样添加命令行参数

来求教一个pacman更新的问题,求高手指导