C言語でcallocを使いテキストファイルから読み込んだ奴をbuffer に入れてそれを区切り文字で区切ってbucket
の中に入れたいです。例えば buffer の中身が aaa bbbb cccc, dddd; とかであればそれを下のコードに書いてあるspliterで区切ってその区切りもじをbucketの中にどんどん入れたいです。 この場合bucket の中が4個になるはずで。
ですが今のところ正しく読み込めていなくSegmentfaultがでます。多分ですがこのtokenize_stringのbucket++が問題だと思うのですが。。
コード #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #define EXAMPLE_ERROR_CODE 1 #define FILE_NOT_FOUND -1 #define unableallocate 3 #define True 1 #define False 0 int tokenize_string(char* buffer, size_t size, word_t* bucket){ size_t len = 0; int count = 0; char* p = NULL; char* spliter = " .,;()\n"; p = strtok(buffer, spliter); while(p!= NULL){ len = strlen(p); if(len != 0){ strcpy(bucket->word, p); bucket->len = len; bucket++; count++; } p = strtok(NULL,spliter); } return count; } //----------------------------------------------------------- size_t readfile(char* filepath, char *buffer){ size_t buff_size; FILE* fp = fopen(filepath, "rb"); if (fp == NULL){ return (size_t)FILE_NOT_FOUND; } fseek(fp, 0, SEEK_END); long pos = ftell(fp); fseek(fp,0,SEEK_SET); buff_size = (size_t)pos; fread(buffer,sizeof(char), buff_size,fp); fclose(fp); return buff_size; } int main(int argc, char *argv[]) { int infile = False; int is_sort = False; char* filename = NULL; size_t size = 0; int count = 0; char *buffer ; word_t *bucket; typedef struct word_t { int len; char* word; } word_t; int i = 0; if (argc <3){ printf("program: missing '--infile <filename> [--sort] [--print-words]'\n"); return EXAMPLE_ERROR_CODE; } for (i = 1; i < argc; i++){ if(strcmp(argv[i], "--infile") == 0){ infile = True; } else if(strcmp(argv[i], "--infile") == 0){ is_sort = True; } else{ if (infile == True && filename ==NULL){ filename = argv[i]; } } } if(infile == False){ printf("No infile error. Exit the program."); return EXAMPLE_ERROR_CODE; } if (filename == NULL){ printf("No filename error. Exit the program"); return EXAMPLE_ERROR_CODE; } // ------------------------------------------------------------ buffer = (char *) calloc(10000, sizeof(char)); if (buffer == NULL){ printf(" can not get memory\n"); return unableallocate; } size = readfile(filename,buffer) ; printf("%s", buffer); size = size -1; printf("%zu",size); // delete later //-------------------------------------------------------------- // tokernize --------------------------------------------------- bucket = (word_t *) calloc(1500, sizeof(word_t)); bucket-> len = 0; bucket-> word = (char*)calloc(1500,sizeof(char)); count = tokenize_string(buffer, size, bucket); printf("%d",count); // delete later free(buffer); free(bucket->word); free(bucket); return 0; } // end main
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。