Сайт | Скачать | Видео | Wiki

Автор Тема: С [ findExec ]  (Прочитано 2650 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Онлайн k0l0p0k

  • Ветеран
  • *****
  • Сообщений: 1611
  • Репутация: +27/-1
  • Автор темы
С [ findExec ]
« : 08 Февраль 2016, 17:40:22 »
еще одно творение на великом и могучем  :).
зачем :
1) awk иногда спотыкается при обработке
2) самообразование
(во вложении рабочий бинарник)
Код
/*
ищет во входных файлах строку Exec= , на выходе все что справа от Exec=
адекватно обрабатывает закомментированные строки,
имена файлов передаются через stdin
поиск в текущей директории(в будущем настраиваемо).
пример использования:
ls *.de* | ./findExec1
*/

#include <stdio.h>
#include <string.h>
#include <dirent.h>
//
DIR *dir;
FILE *fp;

//char *sFindStrUp = "EXEC";
//char *sFindStrLo = "exec";
char sFindStr [256];
char *cComment = "#";
char *cbuf = "./";/*МЕНЯТЬ!!*/
char *lf;

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


  char str[256],buf[256]; 
  int    i,n;
   
/*if (argc<2) return 1;/*проверка аргументов, пока не нужно*/
  str[256]=buf[256]=0;
 
//BEGIN
  while(scanf ("%s",str)!=EOF){ 
  strcpy (buf,cbuf);
  //можно один раз вне цикла,
  // тогда ниже buf[0]=0 заменить на buf[2]=0 (не критично пока)
  strcat(buf,str);
  fp=fopen(buf,"rw");
  if (!fp)  { printf ("не могу открыть %s\n",buf); continue; }
   while (fgets(str,sizeof(str),fp)!=0) {
      if ( (lf=strchr(str, '\n'))!=0 ) *lf=0;  /* уберем перевод строки */
      /*поищем комменты */
      lf = strchr(str,*cComment );
      if( lf ) {*lf=0; }/*обрежем, если строка начинается с # - автоматом уберется из дальнейшего поиска*/
      if ((lf=strstr(str,"Exec"))!=0) {
      strncpy(sFindStr, strchr(lf, '=')+1, sizeof(sFindStr)-1);
      printf ("%s\n",sFindStr);
      break;
      }
    }/* END while  2 */
   fclose(fp);
  buf[0]=0;
  }/* END while  1  */

}/* END main  */
1.пень G2020,8Gb,Radeon RX460 (Debian+openBox+LXPanel)
2.нетбук  Samsung N145 (Debian+openBox+LXPanel, ddr01)

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:С [ findExec ]
« Ответ #1 : 08 Февраль 2016, 19:31:27 »
Не вдаваясь в логику и наличие лишних переменных.

34   while(scanf ("%s",str)!=EOF){      А что будет, если входящая строка превысит 255 символов?
Маловероятно, но все же лучше учитывать, например делать формат "%255s", или вообще
fgets(str, sizeof(str)-1, stdin)

39 fp=fopen(buf,"rw");             Почему бы не просто "r"?

47  strncpy(sFindStr, strchr(lf, '=')+1, sizeof(sFindStr)-1);   При одинаковых размерах str и sFindStr sizeof()-1 никогда не будет достигнут, а вот если когда-нибудь увеличите str, то этот sizeof может не помочь, поскольку последний байт sFindStr не обнулили, мало ли что в нем окажется.

Онлайн k0l0p0k

  • Ветеран
  • *****
  • Сообщений: 1611
  • Репутация: +27/-1
  • Автор темы
Re:С [ findExec ]
« Ответ #2 : 08 Февраль 2016, 20:20:52 »
благодарю за замечания
лишние переменные естественно уберутся, нужные добавятся. это пока еще сырая бэта  8)
Цитата
39 fp=fopen(buf,"rw");             Почему бы не просто "r"?
 изначально было просто "r" :) , эксперементировал , забыл вернуть обратно.
по 34й:
scanf берет с stdin, fgets с файла.
мне  нужно было чтоб с stdin данные брались
+ у scanf полезная особенность - пробелы автоматом обрезаются
про формат "%255s" незнал  :( - нужно попробовать
« Последнее редактирование: 08 Февраль 2016, 20:43:39 от k0l0p0k »
1.пень G2020,8Gb,Radeon RX460 (Debian+openBox+LXPanel)
2.нетбук  Samsung N145 (Debian+openBox+LXPanel, ddr01)

Онлайн k0l0p0k

  • Ветеран
  • *****
  • Сообщений: 1611
  • Репутация: +27/-1
  • Автор темы
Re:С [ findExec ]
« Ответ #3 : 08 Февраль 2016, 20:32:24 »
да по логике:
на входе - список файлов(например *.desktop) - берется с stdin, то есть можно конвеером от других команд принимать.
утилитка ищет в файлах(в каждом) одну строку содержащую Exec=
и выводит все что справа от Exec=
комменты (#) вроде обрабатываются

упс
fgets(str, sizeof(str)-1, stdin) то же с stdin !
« Последнее редактирование: 11 Февраль 2016, 10:36:22 от k0l0p0k »
1.пень G2020,8Gb,Radeon RX460 (Debian+openBox+LXPanel)
2.нетбук  Samsung N145 (Debian+openBox+LXPanel, ddr01)

Оффлайн ander

  • Активный участник
  • Старожил
  • ****
  • Сообщений: 300
  • Репутация: +16/-0
Re:С [ findExec ]
« Ответ #4 : 08 Февраль 2016, 20:37:20 »
scanf берет с stdin, fgets с файла.мне  нужно было чтоб с stdin данные брались
fgets берет с любого файла, какой ему указали.  В том числе со stdin, который открывать не нужно, он и так есть.
Только после него надо перевод строки подрезать.  А scanf для считывания строки без преобразований - это из пушки по воробьям.

Онлайн k0l0p0k

  • Ветеран
  • *****
  • Сообщений: 1611
  • Репутация: +27/-1
  • Автор темы
Re:С [ findExec ]
« Ответ #5 : 08 Февраль 2016, 20:39:22 »
надо поэксперементировать
1.пень G2020,8Gb,Radeon RX460 (Debian+openBox+LXPanel)
2.нетбук  Samsung N145 (Debian+openBox+LXPanel, ddr01)

Онлайн k0l0p0k

  • Ветеран
  • *****
  • Сообщений: 1611
  • Репутация: +27/-1
  • Автор темы
Re:С [ findExec ]
« Ответ #6 : 08 Февраль 2016, 20:46:05 »
да еще - scanf входной поток не на строки а на слова разделяет, по пробелам - удобно, меньше кода - поэтому и взял scanf
« Последнее редактирование: 09 Февраль 2016, 06:17:57 от k0l0p0k »
1.пень G2020,8Gb,Radeon RX460 (Debian+openBox+LXPanel)
2.нетбук  Samsung N145 (Debian+openBox+LXPanel, ddr01)