Kimossab

SO P1 - Turno 1

Mar 12th, 2015
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.27 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define exit_on_null(s,m) if(s == NULL) { perror(m); exit(1); }
  7.  
  8. //print f
  9.  
  10. char strf(char *a, char *b)
  11. {
  12.     if(!b[0] || !a[0]) // se b nao existir ou a nao existir retorna 0
  13.         return 0;
  14.     char *c;
  15.     for(;;)
  16.     {
  17.         if(!*a) //fim da a
  18.             break;
  19.         c=a;
  20.         for(;;)
  21.         {
  22.             if(!*b) //fim da b
  23.                 return 1;
  24.             if(*c++ != *b++) //se nao forem iguais entao nao encontrou ainda, tem de reiniciar a procura na 2ª string
  25.                 break;
  26.         }
  27.         b-=(int)c; // subtrai a posição do c
  28.         b+=(int)a; // adiciona a posiçao onde estava a para repor no inicio o b
  29.         a++; //adiciona apenas um para pesquisar caracter a caracter
  30.     }
  31.     return 0;
  32. }
  33.  
  34. int linhas(FILE *f)
  35. {
  36.     char *line = NULL;
  37.     ssize_t n=0;
  38.     int l=0;
  39.         while((n = getline(&line, &n, f)) != -1)
  40.         if(strf(line,"printf"))
  41.             l++;
  42.     if(line) free(line);
  43.     return l;
  44. }
  45.  
  46. int words(FILE *f)
  47. {
  48.         char *line = NULL;
  49.         ssize_t n=0;
  50.         int w=0, i;
  51.     char flag=0;
  52.         while((n = getline(&line, &n, f)) != -1)
  53.         {
  54.         i=0;
  55.         while(line[i] != '\0')
  56.         {
  57.             if(line[i] == ' ' && flag)
  58.             {
  59.                 w++;
  60.                 flag=0;
  61.             }
  62.             else if(line[i] != ' ' && !flag)
  63.                 flag = 1;
  64.             i++;
  65.         }
  66.         if(flag)
  67.         {
  68.             w++;
  69.             flag = 0;
  70.         }
  71.         }
  72.         if(line) free(line);
  73.         return w;
  74. }
  75.  
  76. int chars(FILE *f)
  77. {
  78.         char *line = NULL;
  79.         ssize_t n=0;
  80.         int c=0;
  81.         while((n = getline(&line, &n, f)) != -1)
  82.                 c+=strlen(line)-1;
  83.         if(line) free(line);
  84.         return c;
  85. }
  86.  
  87.  
  88. int main (int argc, char *argv[])
  89. {
  90.     FILE *fp;
  91.     int c;
  92.     /* Usage */
  93.     if (argc<=1)
  94.     {
  95.         printf("Usage: %s <flags> <file name>\n",argv[0]);
  96.         exit(1);
  97.     }
  98.     fp=fopen(argv[1],"r");/*Abre ficheiro para leitura*/
  99.     exit_on_null(fp,"Erro na abertura");
  100.     /*Leitura linha a linha*/
  101.     while((c=getopt(argc,argv,":lwc"))!=-1)
  102.     {
  103.         fseek(fp,0,SEEK_SET);
  104.         switch(c)
  105.         {
  106.             case 'l': printf("%d linhas (com a palavra printf)\n",linhas(fp));
  107.                 break;
  108.             case 'w': printf("%d palavras\n",words(fp));
  109.                 break;
  110.             case 'c': printf("%d caracteres\n",chars(fp));
  111.                 break;
  112.             default: printf("Not c l or w\nwill use -l as default:\n"); printf("%d\n",linhas(fp)); break;
  113.         }
  114.     }
  115.     fclose(fp);
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment