как я могу реализовать флаг -l и -a в моей собственной функции ls

#c #environment #flags #ls #argv

#c #Окружающая среда #флаги #ls #argv

Вопрос:

 #include<stdio.h> 
 #include<stdlib.h> 
 #include <sys/types.h> 
 #include <dirent.h> 
  
 int main(void) 
 { 
    char *curr_dir = NULL; 
    DIR *dp = NULL; 
    struct dirent *dptr = NULL; 
    unsigned int count = 0; 
  
    curr_dir = getenv("PWD"); 
    if(NULL == curr_dir) 
    { 
        printf("n ERROR : Could not get the working directoryn"); 
        return -1; 
    } 
  
    dp = opendir((const char*)curr_dir); 
    if(NULL == dp) 
    { 
        printf("n ERROR : Could not open the working directoryn"); 
        return -1; 
    } 
  
    printf("n"); 
    for(count = 0; NULL != (dptr = readdir(dp)); count  ) 
    { 
        // Check if the name of the file/folder begins with '.' 
        // If yes, then do not display it. 
        if(dptr->d_name[0] != '.') 
            printf("%s  ",dptr->d_name); 
    } 
  
    return 0; 
 }
 

Создайте программу, которая работает как ls и принимает 2 флага (-a и -l). Это не будет интерактивным, это будет просто вызов программы с флагами в качестве аргументов. Итак, в таком порядке идей.

hls -a должен вести себя как ls -a hls -l должен вести себя как ls -l

Условия.

  • Нулевые утечки памяти. (Valgrind должен давать 0 во всем)
  • Код должен быть скомпилирован в Ubuntu 14.04 со всеми флагами
  • Один единственный файл.

Комментарии:

1. getopt . Предполагая, что вам разрешено использовать библиотеки, и предполагая, что вы спрашиваете о том, как разобрать флаг, а не о том, как реализовать функциональность флага. Пожалуйста, уточните сообщение, если оно является последним.

Ответ №1:

1. посмотрите man ls и посмотрите, каковы аргументы -a и -l

-a не игнорируйте записи , начинающиеся с .

использую формат длинного списка

2. взгляните на эту страницу: Основная функция C

3. выполните итерацию по массиву argv и проверьте наличие

  • a -> установить флаг состояния (например, bool is_a_set)
  • l -> установить флаг состояния (например, bool is_l_set)

4. откройте нужный каталог (opendir)

5. пока readdir не возвращает значение NULL

  • если status_a не задан, а d_name начинается с точки -> продолжить
  • иначе вызовите вашу функцию печати

6. реализация функции печати:

  • если установлен status_l, выведите длинный формат (что бы это ни было)
  • в противном случае выводите только d_name
  • печать дополнительного разделителя

7. очистка и выход