1

你好,我是 C 新手,我正在尝试开始这个实验,其中命令语法是首先列出所有命令行标志,然后列出一个或多个文件名。

我在组织如何扫描输入参数以及区分标志和文件名时遇到了麻烦。

我想过做一个循环来查看参数是标志还是文件名。但我不确定如何开始实施它。由于前 4 个参数可以是任何顺序的潜在标志,因此后面的任何内容都是文件名。但也有可能不给出标志而只以文件名开头。我根本不知道如何初始化这个循环以逐个遍历每个参数。有人可以帮忙吗?

可能的命令行参数示例:

wc fcopy.c head.c (no flags given just file names)
wc -l -c -w -L fcopy.c head.c a.exe (flags given and multiple files)
wc -l -w -c -L fcopy.c (flags given and 1 file name)
4

4 回答 4

2

您可以使用getopt()

检查这些问题:
解析命令行参数?在C/UNIX 的参数解析助手中
处理参数前后的命令行选项Getopt shift optarg

于 2012-09-18T03:06:01.340 回答
2

签出getopt,它允许您解析命令行参数及其标志:

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

int main (int argc, char **argv)
{
  int aflag = 0;
  int bflag = 0;
  char *cvalue = NULL;
  int index;
  int c;

  opterr = 0;

  while ( (c = getopt (argc, argv, "abc:")) != -1 )
    switch (c) {
      case 'a':
        aflag = 1;
        break;
      case 'b':
        bflag = 1;
        break;
      case 'c':
        cvalue = optarg;
        break;
      case '?':
        if (optopt == 'c')
          fprintf (stderr, "Option -%c requires an argument.\n", optopt);
        else if (isprint (optopt))
          fprintf (stderr, "Unknown option `-%c'.\n", optopt);
        else
          fprintf (stderr,
                   "Unknown option character `\\x%x'.\n",
                   optopt);
        return 1;
      default:
        abort ();
      }

  printf ("aflag = %d, bflag = %d, cvalue = %s\n",
          aflag, bflag, cvalue);

  for (index = optind; index < argc; index++)
    printf ("Non-option argument %s\n", argv[index]);
  return 0;
}

使用 getopt 解析参数的示例

于 2012-09-18T03:06:48.793 回答
2

一个一个地读取命令行参数非常简单:

int main( int argc, // Number of strings in array argv char *argv[])

C 函数的两个基本参数是 argc(参数的整数)和 argv(参数的字符串数组)

第一个字符串始终是正在运行的程序的名称,之后是通过命令行传递的参数。

if(argc > 1)
    for( count = 1 count < argc; count++ )
        printf("%s", argv[count]);

将在屏幕上显示通过调用程序名称传递的每个参数。我假设您的标志以“-”作为第一个字符传递?如果是这样,您可以检查每个字符串中第一个字符的内容是否有“-”来判断它是否是标志。

于 2012-09-18T03:16:55.167 回答
0

另请参阅http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

于 2012-09-18T03:05:49.783 回答