ffproxyで指定した文字を新しい単語に置き換えるプログラムを作成しているのですが切り出した文字を出力すると0と1で表現されたしたの図のような文字が出力されます。この文字は何かご存知の方はいらっしゃいますか?
下にread関数とwrite関数の間に新しく加えたコードを載せます。
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5typedef struct list{ 6 char origin[2048]; 7 char change[2048]; 8 struct list *next; 9}chlist; 10chlist *head; 11 12int makelist(); //線形リスト作成 13int searchlist(char *); //リストから文字列検索 14char *chword(char *, char *, chlist *); //ヒットした文字列を置き換え 15size_t replace(void *, size_t); //これをコピペしてrequst.cに埋め込む 16int freelist(); //これもコピペしてrequest.cに埋め込む=headは大域変数で定義 17 18 19int main() //動作確認用 20{ 21 int len; 22 char buf[2048] = "あいうえおabcde12345"; //例 23 24 printf("orginal string: %s\n", buf); //元の文 25 26 len = replace(buf, 2048); //置き換え 27 28 printf("buf length: %d\n",len); //置き換えた後の長さ 29 printf("changed string: %s\n", buf); //置き換えた後の文 30 31 freelist(); //線形リストの解放 32 33 return 0; 34} 35 36size_t replace(void *buf, size_t len){ 37 int num; 38 39 num = makelist(); 40 41 if (num != -1) { 42 len = searchlist(buf); //対応表のファイルが開ければここに来る 43 } 44 else { 45 len = num; //開けなければここに来る(len=-1) 46 } 47 48 return(len); //返り値はうまくいけばbufの長さ,ダメだと-1 49 //size_t型で-1を返すのはやばいかもしれないので0にすべきかもだけど0だとバグるかも 50} 51 52int makelist(){ 53 head = (chlist *)malloc(sizeof(chlist)); //線形リストの先頭 54 55 FILE *corrtab; 56 if((corrtab = fopen("corrtab.csv", "r")) == NULL){ 57 fprintf(stderr,"corrtab.csv don't find.\n"); 58 return -1; 59 } //対応表correspondence table 拡張子.csv 60 61 int num = 0; 62 char tmp[2048]; 63 chlist *curr; 64 65 curr = head; 66 while(fgets(tmp, 2048, corrtab)!=NULL){ 67 strcpy(curr->origin, strtok(tmp,",\n")); //カンマ区切りで変更元の単語を読み込み 68 strcpy(curr->change, strtok(NULL,",\n")); //カンマ区切りで変更後の単語を読み込み 69 curr->next = (chlist *)malloc(sizeof(chlist)); //次のデータを読み込むための場所を作る 70 curr = curr->next; 71 num++; 72 } 73 curr = NULL; 74 fclose(corrtab); 75 return(num); //一応対応表のデータの個数を返り値にしている 76} 77 78int searchlist(char *buf){ 79 chlist *curr; 80 char *bp; 81 char str1[2048]; 82 curr = head; 83 84 while (curr -> next != NULL) { //対応表のデータがあればループ 85 bp = buf; 86 strcpy(str1, curr -> origin); //bpはbuf[]を前から見ていって単語を探す奴 87 while (bp != NULL) { //bpがbufの一番後ろじゃなければループ 88 bp = strstr(bp, str1); 89 if (bp != NULL) { //bpがbufの一番後ろじゃなければ検索 90 bp = chword(buf, bp, curr); 91 } 92 } 93 curr = curr->next; //対応表の次のデータで検索を始める 94 } 95 return(strlen(buf)); //返り値は変更後のbufの長さ 96} 97 98char *chword(char *buf, char *bp, chlist *curr){ 99 char cpbuf[2048], *p, *cp; 100 p = bp; //pが指すとこから元の文をコピーしたら文字数変わってもいけるようになるやつ 101 strcpy(cpbuf, buf); //pのとこからコピーするためにコピーして保存しとく 102 size_t ori = strlen(curr->origin); 103 size_t cha = strlen(curr->change); 104 p = p+cha; 105 cp = cpbuf + (bp - buf) + ori; //帳尻を合わせるためにpとcpをいじる 106 107 strcpy(p, cp); //文字数変わってもいけるようにコピー 108 strncpy(bp, curr->change, cha); //bpが指してるとこに変換後の単語を入れるとすべてがうまくいく 109 110 printf("\"%s\" was replaced by \"%s\"\n", curr->origin, curr->change); //うざかったらコメントアウト 111 112 bp += cha; 113 114 return(bp); 115} 116 117int freelist(){ //mallocで場所取ったら開放しないといけないらしいので解放するための関数 118 chlist *curr, *prev; 119 curr = head; 120 prev = curr; 121 curr = curr->next; 122 while (curr != NULL) { 123 free(prev); 124 prev = curr; 125 curr = curr->next; 126 } 127 free(prev); 128 return 0; 129} 130
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/09 07:02