質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

294閲覧

ffproxyで生じる文字化け?について

tekondo

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/07/25 00:44

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

切り出した文字が、正しい文字コードでないため0と1などで表示されます。
実行ファイルなどのバイナリファイルをcatコマンドで表示させてみると、非文字の部分が0と1で表示されるのがわかると思います。

適当な、__corrtab.csv__を作成して、掲題のコードを実行してみましたが、問題なく文字が置き換えられて表示されています。
csvファイルが正しいかどうか、確認してみてください。特に文字コードはソースコードのものと同じでしょうか。

また、__malloc__は割り付けたメモリを0クリアしません。
このため、__chlist__には、値が設定されない限り不定な値が入ってしまいます。
特にリスト最後のnextには、値を設定していないようなので、値は不定です。
割り付けたメモリを0クリアするか、mallocの代わりにcallcを使用した方が良いと思います。

C

1xxx = (chlist *)malloc(sizeof(chlist)); 2memset(xxx, 0, sizeof(chlist)); /* メモリクリア */

※確認した環境では、問題なく動作しているようなので、たまたま0クリアされている?

投稿2017/08/01 13:50

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tekondo

2017/08/09 07:02

ご回答ありがとうございました。どうやらプロキシで通信しているデータを表示しようとしていたらしくこのような暗号化されたデータが出力されていたようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問