C中的标志顺序

时间:2017-03-07 15:39:31

标签: c arguments argv getopt

所以我对argv数组中的C中的标志和参数有疑问。 当我通过终端输入commant时: 示例:./main a b c -a 它不会在最后识别-a但是如果我把它放在所有参数的开头,例如:./main -a a b c 它会检测到它。

我尝试交换它,如果是这样,它将在所有的争论之前,但在交换后它不会继续。有点像忽略它之后的for循环。所以它只是交换它然后结束案件。如果有人知道我在这里失踪了什么,我会很高兴。

代码:

while ( (c = getopt(argc, argv, ":ahd:")) != -1) {
    switch (c) {
        case 'a': 
            if(strcmp(argv[argc-1], "-a") == 0){
                swap(&argv[argc-1], &argv[1]);
            }
            for(i = optind; i < argc; i++){
                for(j = optind; j < argc - 1; j++){
                    if(strcmp(argv[j], argv[j + 1]) > 0){
                        swap(&argv[j], &argv[j + 1]);
                    }
                }
            }

            for(z = optind; z < argc; z++){ 
                printf("%s\n", argv[z]);
            }
            printf("%s\n", argv[1]);
            break;

2 个答案:

答案 0 :(得分:0)

getopt()的GNU版本允许对参数进行排列,以便处理所有-a样式选项(出现在--选项之前),即使存在非选项他们面前的争论。

some_program -z abc def -b -- -w warning

-z-b选项将被GNU getopt()识别,但-w将是非选项参数。

getopt()的POSIX版本不允许这样做; getopt()的许多非GNU实现都不这样做。 GNU知道他们所做的是一个扩展;可以通过在环境中设置POSIXLY_CORRECT来转换置换行为。

如果您希望在任何地方识别选项,请在程序中使用GNU getopt()。如果要使用本地getopt()保持可移植性,或者无法在程序中使用GPL代码,请将系统设计为在非选项参数之前放置选项。请注意,像make和C编译器这样的程序已经有自定义参数处理系统,允许交叉选项和非选项参数 - 但是你应该遵循POSIX编码指南(Utility Conventions)进行选项处理,除非你有充分理由不这样做。

答案 1 :(得分:0)

好的我已经修改了句子

if(strcmp(argv[optind-1], "-a") == 0){
            swap(&argv[optind-1], &argv[1]);
        }