src_unix.tar.gz

  • PUDN用户
    了解作者
  • Unix_Linux
    开发工具
  • 9KB
    文件大小
  • gz
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2015-12-20 15:19
    上传日期
Pointer in C for C programming
src_unix.tar.gz
  • src_unix
  • read_line1
  • read_line.h
    165B
  • read_line.c
    2.2KB
  • word_list
  • add_word.c
    1.5KB
  • word_manage_p.h
    286B
  • finalize.c
    459B
  • dump_word.c
    382B
  • initialize.c
    261B
  • word_array
  • add_word.c
    1.2KB
  • word_manage_p.h
    295B
  • finalize.c
    383B
  • dump_word.c
    234B
  • get_word_count.c
    656B
  • initialize.c
    287B
  • read_line2
  • read_line.h
    399B
  • read_line.c
    3.1KB
  • array.c
    397B
  • array2.c
    303B
  • variable_array.c
    593B
  • vmtest.c
    459B
  • quick_sort.c
    1.3KB
  • tiny_printf.c
    567B
  • read_file.c
    1.3KB
  • byteorder.c
    271B
  • auto.c
    265B
  • free.c
    200B
  • pointer_calc.c
    394B
  • pointer.c
    578B
  • pass_array.c
    272B
  • double.c
    64B
  • draw_shape.c
    1010B
  • word_manage.h
    258B
  • get_word.c
    778B
  • pass_2d_array.c
    369B
  • shape.h
    1.9KB
  • output_argument.c
    194B
  • stackoverflow.c
    270B
  • print_address.c
    1KB
  • float.c
    64B
  • cat.c
    575B
  • realloc.c
    481B
  • README
    1.3KB
  • get_word.h
    159B
  • read_slogan.c
    645B
  • alignment.c
    435B
  • main.c
    736B
内容介绍
#include <stdio.h> #include <stdlib.h> #include <assert.h rel='nofollow' onclick='return false;'> #include <string.h> #include "read_line.h" #define ALLOC_SIZE (256) /* * 行を読み込むバッファ。必要に応じて拡張される。縮むことはない。 * free_buffer()の呼び出しで解放される。 */ static char *st_line_buffer = NULL; /* * st_line_bufferの先に割り当てられている領域のサイズ。 */ static int st_current_buffer_size = 0; /* * st_line_bufferの中で、現在文字が格納されている部分のサイズ。 */ static int st_current_used_size = 0; /* * st_line_bufferの末尾に1文字追加する。 * 必要とあれば、st_line_bufferの先の領域を拡張する。 */ static ReadLineStatus add_character(int ch) { /* * st_current_used_sizeは必ず 1づつ増えるので、 * いきなり抜かれていることはないはず。 */ assert(st_current_buffer_size >= st_current_used_size); /* * st_current_used_sizeがst_current_buffer_sizeに追い付いたら、 * バッファを拡張する。 */ if (st_current_buffer_size == st_current_used_size) { char *temp; temp = realloc(st_line_buffer, (st_current_buffer_size + ALLOC_SIZE) * sizeof(char)); if (temp == NULL) { return READ_LINE_OUT_OF_MEMORY; } st_line_buffer = temp; st_current_buffer_size += ALLOC_SIZE; } /* バッファの末尾に1文字追加 */ st_line_buffer[st_current_used_size] = ch; st_current_used_size++; return READ_LINE_SUCCESS; } /* * バッファを解放する。別に呼ばなくても差し支えはないけれど、 * 「プログラム終了時には、malloc()した領域は全部free()しておきたい」 * という人は、最後にこれを呼べば良い。 */ void free_buffer(void) { free(st_line_buffer); st_line_buffer = NULL; st_current_buffer_size = 0; st_current_used_size = 0; } /* * fpから1行読み込む。 */ ReadLineStatus read_line(FILE *fp, char **line) { int ch; ReadLineStatus status = READ_LINE_SUCCESS; st_current_used_size = 0; while ((ch = getc(fp)) != EOF) { if (ch == '\n') { status = add_character('\0'); if (status != READ_LINE_SUCCESS) goto FUNC_END; break; } status = add_character(ch); if (status != READ_LINE_SUCCESS) goto FUNC_END; } if (ch == EOF) { if (st_current_used_size > 0) { /* 最後の行の後に改行がなかった場合 */ status =add_character('\0'); if (status != READ_LINE_SUCCESS) goto FUNC_END; } else { status = READ_LINE_EOF; goto FUNC_END; } } *line = malloc(sizeof(char) * st_current_used_size); if (line == NULL) { status = READ_LINE_OUT_OF_MEMORY; goto FUNC_END; } strcpy(*line, st_line_buffer); FUNC_END: if (status != READ_LINE_SUCCESS && status != READ_LINE_EOF) { free_buffer(); } return status; } int main(void) { ReadLineStatus status; char *line; for (;;) { status = read_line(stdin, &line); if (status == READ_LINE_EOF) break; puts(line); } return 0; }
评论
    相关推荐