gets
calloc
realloc
void *realloc(void *oldptr, size_t newsz){// this call is not a real function, used here as placeholder// for internal information managed by the heap allocatorsize_t oldsz = available_size_at_address(oldptr);if (newsz == 0) {free(oldptr);return NULL;}if (oldsz >= newsz) {return oldptr;}void *newptr = malloc(newsz);if (newptr != NULL && oldptr != NULL) {memcpy(newptr, oldptr, oldsz);free(oldptr);}return newptr;}
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调试不出来。


