ここから本文です

数学の英和辞書がほしくなりました。プログラムの練習に作ってみようと思い、xmlの...

k_a********さん

2011/4/313:03:08

数学の英和辞書がほしくなりました。プログラムの練習に作ってみようと思い、xmlの響きがカッコよかったのでテキストの形だったものを、一応xmlにしてみようと試みました。しかし、うまくいきません。教えてください

visual c++ 2010を使っています。
テキストは http://www11.ocn.ne.jp/~guiter/eng2jpn/02.html のものをコピーしています。(文字コードはANSIで保存)

MD_b.txtは
Bernoulli theorem:ベルヌーイの定理
Bernstein polynomial:ベルンシュタイン多項式
Bernstein theorem:ベルンシュタインの定理(⇒Schroeder-Bernstein theorem:シュレーダー-ベルンシュタインの定理)
Bertrand-Chebyshev's theorem:ベルトラン-チェビシェフの定理(⇒Bertrand's postulate:ベルトランの定理)

こんな感じです。(これで言うと3行目で宜しくないことが起きるようです。他にもあります。)

ソースファイルは

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>

#define TOP "<?xml version=\"1.0\" encoding=\"Shift-jis\"?>\n"
#define FMT "\t<%s>\n\t\t<eng>%s</eng>\n\t\t<jap>%s</jap>\n\t</%s>\n",eng_t,eng,jap,eng_t

#define TXT "MD_b.txt"//読み込みテキストデータ
#define XML "MD_b.xml"//書き込み

#define ERORRE(fp) if((fp) == NULL){ return -1; } //エラー処理 引数はファイルポインタ

void tagstr(char *,char *);//大文字なら小文字にそして小文字以外なら削除。

int main(void)
{
FILE *fp = fopen(TXT,"r"); ERORRE(fp)
FILE *fw = fopen(XML,"w"); ERORRE(fw)

char eng[100];//英語データ
char eng_t[100];//タグ用データ
char jap[400];//日本語説明 一応多めに
char *tok; //分割用

char str[500];//一行

fprintf(fw,TOP);
fprintf(fw,"<md>\n");

while( fgets( str, 500, fp ) ){
tok = strtok( str, ":" ); //:までの文字列を得る
strcpy( eng, tok);
tok = strtok( NULL, "\n"); //:後から文末までの文字列取得
strcpy( jap, tok);
tagstr( eng_t, eng ); //eng を加工して eng_tにコピー
fprintf(fw,FMT);}
fprintf(fw,"</md>\n");

getchar();
fclose(fp);
fclose(fw);
return 0;
}
void tagstr(char *oeng_t, char *oeng)
{
char *eng = oeng;
char *eng_t = oeng_t;
while(*eng != '\0'){
*eng_t = *eng;
if( isupper((int)*eng ) ){ //大文字なら真
*eng_t = tolower(*eng_t); //小文字にして代入
}
if( *eng < 'a' || *eng > 'z' ){
eng_t--;
}
eng++;
eng_t++;
}
*eng_t = *eng;
}

日本語の初めにFがつくことと、実行できないことの解決策をお願いします。
(xmlの構造?は改善していくつもりです。↑では意味が無いですから。)

閲覧数:
332
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

yur********さん

2011/4/316:16:34

文字コードはANSIで保存といってますが、日本語が含まれるので実際はShift-Jisで保存したのでしょうね。
問題点の根本は、日本語を含む文字列を処理しているのに、それを考慮していないことです。

> tok = strtok( str, ":" ); //:までの文字列を得る
ここで指定している":"は、半角(ANSI)ではなく全角(マルチバイト文字)なので、strtok()で処理した結果、":"の1バイト目で分割されたため、日本語の始めにFがついてしまうことになったわけです。

プロジェクトの文字セットをマルチ バイト文字セットに設定し、tchar.hをインクルードして、
・char => TCHAR
・strtok() => _tcstok()
・isupper() => _istupper()
に修正してください。

質問した人からのコメント

2011/4/3 19:00:15

降参 できました。tchar.hの使い方を学ぼうと思います。ありがとうございます。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる