Opgaver i denne lektion   Gå til annoteret slide, hvor denne opgave er tilknyttet -- Tastaturgenvej: 'u'   Alfabetisk indeks   Kursets hjemmeside   

Opgaveløsning:
En simpel grep funktion


Her er en løsning på opgaven (som endvidere understøtter en -n option, der afstedkommer udskrift af linienumre):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLINE 200

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

  char line[MAXLINE], *pattern, *file_name;
  FILE *ifp;
  int line_numbers, n = 1;

  if (argc == 3) {
    file_name = argv[2]; line_numbers = 0; pattern = argv[1];
  }
  else if (argc == 4 && strcmp(argv[1], "-n") == 0) {
    file_name = argv[3]; line_numbers = 1; pattern = argv[2];
  }
  else {
    fprintf(stderr, "Calling form: search [-n] search_string file\n");
    exit(1);
  }
  
  if ((ifp = fopen(file_name, "r")) == NULL){
    fprintf(stderr, "\nCannot open %s\n\n", file_name);
    exit(1);
  }

  while(fgets(line, MAXLINE, ifp) != NULL){
    if (strstr(line, pattern) != NULL){
      if (line_numbers)
        printf("%3i: %s", n, line);
      else
        printf("%s", line);
    }
    n++;
  }

  fclose(ifp);
  
  return 0;
}

Vi vil antage at programmet findes på kildefilen simple-grep.c. Oversættelse og kørsel (søgning i kildefilen selv) kan foregå på denne måde:

   > gcc simple-grep.c -o search
   > ./search pattern simple-grep.c

Outputtet er:

   char line[MAXLINE], *pattern, *file_name;
   file_name = argv[2]; line_numbers = 0; pattern = argv[1];
   file_name = argv[3]; line_numbers = 1; pattern = argv[2];
   if (strstr(line, pattern) != NULL){

Hele problemløsningen forekommer i main funktionen, hvilket er dårlig stil.