#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. очистка и выход