Итерация по параметрам программы ls из командной строки - PullRequest
0 голосов
/ 06 августа 2020

Я пишу программу, которая является специальной версией ls с некоторыми параметрами. Параметры могут быть введены как «-i» или что-то вроде «-ilR». Эта часть моего кода перебирает аргументы командной строки и соответственно устанавливает структуру. За исключением случаев, когда я запускаю программу с помощью «./myProgram -i Directory», она не go в настроенной мной тестовой печати. ​​

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/fcntl.h>
#include <stdbool.h>
#include <string.h>

struct optionArguments{
    bool argumenti;
    bool argumentl;
    bool argumentR; 
};

int main(int argc, char* argv[]){

    struct optionArguments options;
        options.argumenti = false;
        options.argumentl = false;
        options.argumentR = false;

   
    for(int i = 1; i<argc-2; i++){
        for(int j = 0; j<strlen(argv[i]); j++){
            char chr = argv[i][j];
            if(chr == 'i'){
                options.argumenti = true;
            }
            if(chr == "l"){
                options.argumentl = true;
            }
             if(chr == "R"){
                options.argumentR = true;
            }
        }
    }

    if(options.argumenti){
        printf("OPTION I\n");
    }
}

любая помощь / совет приветствуются

edit: я просто поместил пробную печать во второй l oop, и он вообще ничего не печатает, поэтому второй l oop даже не работает.

1 Ответ

1 голос
/ 06 августа 2020

Будет намного проще, если вы используете функцию getopt(), предназначенную для обработки синтаксического анализа аргументов командной строки.

Примечание. Поскольку вы уже включили библиотеку unistd, используйте getopt, который будет намного мудрее, в противном случае доступны другие реализации, такие как argp()

Вот программа, которая использует getopt из POSIX C Library unistd

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/fcntl.h>
#include <stdbool.h>
#include <string.h>

struct optionArguments{
    bool argumenti;
    bool argumentl;
    bool argumentR; 
};

int main(int argc, char* argv[]){

    struct optionArguments options;
        options.argumenti = false;
        options.argumentl = false;
        options.argumentR = false;

    int opt;
    while ((opt = getopt(argc, argv, "ilR")) != -1) {
        switch (opt) {
        case 'i': options.argumenti = true; break;
        case 'l': options.argumentl = true; break;
        case 'R': options.argumentR = true; break;
        default:
            fprintf(stderr, "Usage: %s [-ilR] \n", argv[0]);
            exit(EXIT_FAILURE);
        }
    }


    if(options.argumenti){
        printf("OPTION I\n");
    }
    if(options.argumentl){
        printf("OPTION l\n");
    }
    if(options.argumentR){
        printf("OPTION R\n");
    }
}

Для других способов реализации посетите: Анализ аргументов командной строки в C?

...