Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 可选的getopt函数_C_Getopt - Fatal编程技术网

C 可选的getopt函数

C 可选的getopt函数,c,getopt,C,Getopt,我很难选择getopt操作。这是我代码的一部分。它接受一个参数文件,如果参数文件存在,则计算字符数。如果不是,则统计标准输入字符 我的问题是,一旦optarg未声明,它将设置为什么?我该如何让我的选项-c成为可选选项,并使其起作用 目前它总是从stdin读取 while( (option = getopt(argc, argv, "c::") ) != -1 ) { switch(option) { case 'c': if (optarg == NULL) {

我很难选择getopt操作。这是我代码的一部分。它接受一个参数文件,如果参数文件存在,则计算字符数。如果不是,则统计标准输入字符

我的问题是,一旦optarg未声明,它将设置为什么?我该如何让我的选项-c成为可选选项,并使其起作用

目前它总是从stdin读取

while( (option = getopt(argc, argv, "c::") ) != -1 ) {
  switch(option) {
  case 'c':
    if (optarg == NULL) {
        file = stdin;
      }
    else {
      file = fopen(optarg, "r");
    }
    while( (ch = fgetc(file)) != EOF ) {
      count++;
    }
    printf("%d %s\n", count, optarg);
    fclose(file);
    break;

“标准”(POSIX)不支持选项的可选参数。双冒号的使用是一种扩展

要使
getopt()
optarg
设置为选项的“可选”参数,请在调用程序时使用如下选项:

program -coptional_argument_to_option_c

不过,您也可以选择以下方法之一:

  • 定义
    -c文件名
    ,文件名为必填项。如果
    -c filename
    未命中,只需计算从
    stdin
    读取的内容

  • 或者定义
    -c
    ,不带任何参数来告诉您的程序要做什么(在这里计数),并另外定义一个选项来告诉您的程序从哪里读取,如
    -f filename
    。如果后者未从
    stdin
    读取


我在getopt手册页中找到:


两个冒号表示一个选项包含一个可选参数;如果当前argv元素中有文本(即,与选项名称本身相同的单词,例如“-oarg”),则返回optarg,否则optarg设置为零

这一页解释得稍微好一点:

最后,如果optstring中的选项字母后跟两个冒号字符,则允许该选项具有可选选项参数。(说快三倍!)如果此类参数与选项位于同一argv元素中,则视为存在,否则不存在。如果不存在,GNU getopt()将返回选项字母并将optarg设置为NULL。例如,给定-

while((c=getopt(argc,argv,“ab:”)!=1)
...

-对于-bYANKEES,返回值为“b”,optarg指向“YANKEES”,而对于-b或“-b YANKEES”,返回值仍然为“b”,但optarg设置为NULL。在后一种情况下,“YANKEES”是一个单独的命令行参数


检查这是否也适用于您。

一旦未声明,optarg将设置为什么???你再清楚不过了。为什么
::
,而不是
?“两个冒号表示一个选项包含可选参数”-LinuxManual抱歉,我不清楚。我正在澄清当选项-c变为可选时,optarg是否设置为NULL。我想这可能就是为什么这是错误的,因为当我打印optarg时,它给出了一个Seg错误,我不知道这个GNU扩展。请查看我的更新答案。当filename参数是必需的(c:)时,getopt()会自动指示该选项需要参数。那么我应该把条件语句放在哪里?@Sarc:哪个“条件语句”?谢谢,我已经完成了第一个选项。谢谢,这个简短的选项语法相当神秘。