a3.pdf

gets

绝对不要用gets函数,用fgets代替。
image.png
image.png

calloc

image.png
line 10将nw四舍五入到8的倍数。

realloc

  1. void *realloc(void *oldptr, size_t newsz)
  2. {
  3. // this call is not a real function, used here as placeholder
  4. // for internal information managed by the heap allocator
  5. size_t oldsz = available_size_at_address(oldptr);
  6. if (newsz == 0) {
  7. free(oldptr);
  8. return NULL;
  9. }
  10. if (oldsz >= newsz) {
  11. return oldptr;
  12. }
  13. void *newptr = malloc(newsz);
  14. if (newptr != NULL && oldptr != NULL) {
  15. memcpy(newptr, oldptr, oldsz);
  16. free(oldptr);
  17. }
  18. return newptr;
  19. }

read_line

自己写的read_line程序,作业中没出现问题。

#define MINIMUM_SIZE 32
char *my_read_line(FILE *fp){
  size_t curr_size = MINIMUM_SIZE;
  char *curr_line = NULL;

  while (ungetc(getc(fp), fp) != EOF) {
    curr_line = realloc(curr_line, curr_size);
    assert(curr_line != NULL);

    fgets(curr_line, curr_size, fp);
    char *temp = strstr(curr_line, "\n");
    if (temp) {
      *temp = '\0';
      return curr_line;
    } else {
      assert(fseek(fp, 1 - curr_size, SEEK_CUR) == 0);
      curr_size *= 2;
    }
  }
  return NULL;
  //return NULL; // replace with your implementation 
}

myuniq

void print_uniq_lines(FILE *fp){
  char *line2match = NULL;
  char *curr_line = NULL;
  int count = 1;

  while (ungetc(getc(fp), fp) != EOF) {
    if (line2match == NULL) {
      line2match = my_read_line(fp);
      assert(line2match != NULL);
    }
    curr_line = my_read_line(fp);
    assert(curr_line != NULL);

    if (strcmp(curr_line, line2match)) {
      printf("%d %s\n", count, line2match);
      count = 1;
    } else {
      count++;
    }
    free(line2match);
    line2match = curr_line;
  }
  if (line2match != NULL) {
    printf("%d %s\n", count, line2match);
    free(line2match);
  }
}

mytail

这个题目未完成,代码有问题,gdb调试不出来。
image.png