【问题标题】:C - Check the arguments of the mainC - 检查主要参数
【发布时间】:2018-10-20 16:28:23
【问题描述】:

我需要检查主函数的参数。您可以使用 2 个选项 -a--b value 运行主程序,但有一些选项,您需要输入文件 (1,2...N) 和输出文件。

例如:./main -a --b 2 input1 input2 output

但选项可以在任何地方...

例如:./main input1 -a input2 input3 input4 output --b 1

运行程序所需的最低限度是输入和输出。

这是我的代码:

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

int NB = 1;
int FLAGA = 0;
const char *FILEOUT;
char *FILEIN[];

int args_check(int argc, char const **argv) {
    int index = 0;
    if(argc < 3){
         printf("Not enough args.\n");
         return -1;
    }
    for(int i = 1; i < argc; i++) {
        if(strcmp(argv[i], "-a") == 0) {
            FLAGA = 1;         
        }
        else if(strcmp(argv[i],"--b") == 0) {
            i++;
            NB = atoi(argv[i]);
        }
        else {
            FILEIN[index] = argv[i];
            index++;
        }
    }
    FILEOUT = FILEIN[index - 1];
    printf("Input(s) :");
    for(int i = 0; i < index - 1; i++)
        printf(" %s", FILEIN[i]);
    printf("\n");
    printf("Output : %s\n", FILEOUT);
    return index - 1;
}

int main(int argc, char const *argv[]) {
    int index = args_check(argc, argv);
    if(index < 0)
        return 1;
    for(int i = 0; i < index; i++)
        printf("%s\n", FILEIN[i]);
    return 0;
}

./main -a --b 1 test1 test2 test3 out,在我的终端上,我看到了

 Input(s) : test1 out test3
 Output : out
 test1
 out
 test3

为什么我没有收到test1 test2 test3

【问题讨论】:

  • 为什么要重新发明轮子?在 Unix/Linux 系统上运行的函数 getopt 会为您处理所有这些。如果您正在使用 Windows 系统,请查找 XGetOpt

标签: c arguments main options


【解决方案1】:

您没有在main 中正确打印FILEIN 的元素:

for(int i = 0; i < index; i++)
    printf("%s\n", FILEIN);

您将FILEINchar * 的数组)传递给%s 格式说明符,该说明符需要单个char *。你忘了索引这个数组:

for(int i = 0; i < index; i++)
    printf("%s\n", FILEIN[i]);

关于读取的输入与输出不匹配,这是罪魁祸首:

char *FILEIN[];

这样的定义作为局部或全局变量(仅作为函数的参数)无效,因为未指定数组的大小。 gcc 会将此视为一个包含 1 个元素的数组,尽管这是一个编译器扩展。结果是你注销了数组的末尾,调用了undefined behavior

你需要给这个数组一个固定的大小,例如:

char *FILEIN[100];

那么你需要确保你写的元素不超过(在这种情况下)100 个。

【讨论】:

  • 呵呵,是的...但是为什么我有Input(s) : i1 o i3而不是Input(s) : i1 i2 i3
  • @MrGuim 你用-d --maxthreads 调用程序,它没有出现在输入文件列表中,所以你发布的代码显然不是你正在运行的代码。所以用你实际使用的代码更新你的问题,我们会看到的。
  • 完成我的整个程序。
  • 感谢您的帮助!
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 2016-08-26
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2013-06-07
相关资源
最近更新 更多