Почему программа не входит в оператор if, когда должна

Я пытаюсь реализовать команду «ls», в которой перечислены файлы и каталоги. Я установил следующий массив входящих аргументов:

argv[0] = "./a.out"
argv[1] = "-l"
argv[2] = "test.c"

Вот мой код (предположим, что функция main передает argc и argv функции I_AM_LS):

#include "ls.h"

int I_AM_LS(int argc, char ** argv)
{
    // 'INCLUDING_HIDDEN_FILE' indicates program performs ls including hidden files
    // 'EXCLUDING_HIDDEN_FILE' indicates program performs ls excluding.
    int     hidden_flag     =   EXCLUDING_HIDDEN_FILE;
    int     detail_flag     =   SIMPLY;     // default option in ls.
    // 'IN_DETAIL' indicates program performs ls with additional information.
    // 'SIMPLY' indicates program performs ls without.
    char option;
    int i;
    DIR * dp;

    while ((option = getopt(argc, argv, "al")) != -1)
    {
        switch (option)
        {
            case 'a':
                hidden_flag     =   INCLUDING_HIDDEN_FILE;
                break;
            case 'l':
                detail_flag     =   IN_DETAIL;
                break;
            default: /* '?' */
                printf("invaild option.\n");
                return -1;
        }
    }


if( argv[optind] != NULL && argv[optind + 1] != NULL) // multiple argument
{
    ; // I have not finished the corresponding code yet.
}
else
{
    if( argv[optind] == NULL) // case 1
        I_REALLY_CALL_ls("./", hidden_flag, detail_flag);
    else
        I_REALLY_CALL_ls(argv[optind], hidden_flag, detail_flag);
}
    printf("optind %d %d\n", optind, argv[optind]);
    return 0;
}
}

int main(int argc, const char * argv[])
{
    I_AM_LS(argc, argv);
    return 0;
}

После начального цикла синтаксического анализа программа не переходит к оператору if 'argv[optind] != NULL'. Мы знаем, что optind равно 2, а argv[optind] указывает на "test.c", а не NULL, такое же поведение наблюдается и в режиме отладки.

Есть ли проблемы с передачей argv и argc в функцию I_AM_LS? Что я должен делать?

Примечание. Я работаю над Xcode в OS X.


person inherithandle    schedule 09.04.2013    source источник


Ответы (1)


if( argv[optind] == NULL) // case 1
    I_REALLY_CALL_ls("./", hidden_flag, detail_flag);
else if( argv[optind] != NULL && argv[optind] != NULL)
{
    ; 
}

Условие в этом else if — это argv[optind] != NULL, оцененное дважды без уважительной причины. Итак, если первое условие не выполняется, выполняется это, вы ничего не делаете (;) и

else if( argv[optind] != NULL)
{
    // single non-option arguemnt.
    I_REALLY_CALL_ls(argv[optind], hidden_flag, detail_flag);
}

недоступен.

person Daniel Fischer    schedule 09.04.2013
comment
Это была опечатка. Мое намерение - утверждение «argv[optind] != NULL && argv[optind + 1]». Я думаю, это указывает на то, что командная строка состоит из нескольких аргументов, не являющихся параметрами. Я отредактировал код. Вы можете проверить мой код? есть улучшения? - person inherithandle; 09.04.2013