• ベストアンサー

ローマ字変換アルゴリズムを教えてください。

#include<stdio.h> #include<stdlib.h> #include<string.h> wchar_t t[50][5]={ L"あ",L"い",L"う",L"え",L"お", L"か",L"き",L"く",L"け",L"こ", L"さ",L"し",L"す",L"せ",L"そ", L"た",L"ち",L"つ",L"て",L"と", L"な",L"に",L"ぬ",L"ね",L"の", L"は",L"ひ",L"ふ",L"へ",L"ほ", L"ま",L"み",L"む",L"め",L"も", L"や",L" ",L"ゆ",L" ",L"よ", L"わ",L" ",L"を",L" ",L"ん" }; char t2[50][3]={ "a ","i ","u ","e ","o ", "ka","ki","ku","ke","ko", "sa","si","su","se","so", "ta","ti","tu","te","to", "na","ni","nu","ne","no", "ha","hi","hu","he","ho", "ma","mi","mu","me","mo", "ya"," ","yu"," ","yo", "wa"," ","wo"," ","nn" }; wchar_t *henkan() { wchar_t str[150]; char str2[300]; int i=0; int j; scanf("%s",&str2); while(str2[i]) { for(j=0;j<50;j++) { if(strcmp(str2,t2[j])==0) { str[i]=t[j]; str[i+1]='\0'; } } i+=2; } printf("入力された文字は%sです。\n",str); return str; } int main(void) { wchar_t str[1000]; while(1) { str=henkan(); } return 0; } ローマ字から、ひらがなに変換するアルゴリズムを考えているのですが、 なかなかうまくいきません。このソースコードはコンパイルもできませんでした。 どうすれば、うまくいきますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • stingy
  • ベストアンサー率37% (144/379)
回答No.4

自分の環境で scanf("%s",&str2); では "a i u e o " と入力してもstrには"a"しか入らない。 strcmpの使い方、意図するものと違ってるはずだし とりあえず while(str2[i]) {  for(j=0;j<50;j++)  {   if(str2[i]==t2[j][0]) {    if(j<5) {     //(後で)     i++;     break;    }    else {     if(str2[i+1]==t2[j][1]) {      //(後で)      i+=2;      break;     }    }   }  }  //if(j==50)   //(後で) } str[i]=t[j]; の部分は、エラーだし i は使えなくなるから別の処理にする。 wchar_tも使えないのでcharにしてstrcatか?というとこです。 void henkan()にして少しずつテストしながら考えてみては?

TKOZ
質問者

お礼

ttp://www.grapecity.com/japan/powernews/column/clang/007/page01.htm ↑を参考にして、違うアルゴリズムで作ってみました。 #include<stdio.h> #include<windows.h> #include<string.h> #include<stdlib.h> char Tbl[13]={'k','s','t','n','h','m','y','r','w','g','z','d','b'}; char Tbl02[13][5][3]={ "か","き","く","け","こ", "さ","し","す","せ","そ", "た","ち","つ","て","と", "な","に","ぬ","ね","の", "は","ひ","ふ","へ","ほ", "ま","み","む","め","も", "や"," ","ゆ"," ","よ", "ら","り","る","れ","ろ", "わ"," ","を"," ","ん", "が","ぎ","ぐ","げ","ご", "ざ","じ","ず","ぜ","ぞ", "だ","ぢ","づ","で","ど", "ば","び","ぶ","べ","ぼ" }; char Tbl03[5]={'a','i','u','e','o'}; char str2[300]; void henkan(void) { int i=0; int j=0; int k=0; while(str2[i]) { switch(str2[i]) { case 'a':printf("あ");break; case 'i':printf("い");break; case 'u':printf("う");break; case 'e':printf("え");break; case 'o':printf("お");break; } for(j=0;j<13;j++) { if(Tbl[j]==str2[i]) { i++; for(k=0;k<5;k++) { if(str2[i]==Tbl03[k]) { printf("%s",Tbl02[j][k]); } } } } i++; } } int main(void) { while(1){gets(str2);henkan();} return 0; }

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

「っ」とか「きゃ」「きゅ」「きょ」とかは対応しなくてもいいのでしょうか?

回答No.2

No.1追記 とりあえず、ざっくりと見たところで 1. >wchar_t *henkan() >{ >wchar_t str[150]; (略) >return str; >} ローカル変数のアドレスを呼び出し元に返すのは危険。 ローカル変数は、関数が呼び出された際に確保されるの領域なので、戻った際に解放されるため、値の保証はできない。 2. >str[i]=t[j]; 代入式として成立していない。 「wchar_t [5]」分を「wchar_t一つ分」に代入しようとしている。 3. >str=henkan(); 代入式として成立していない。 戻り値は「ポインタ」を返しているのに、入れる先は「配列」。 考え方は間違っていないけど、それを実現するための式が間違っている。

TKOZ
質問者

補足

>ローカル変数のアドレスを呼び出し元に返すのは危険。 staticにすべきでしたね。 >「wchar_t [5]」分を「wchar_t一つ分」に代入しようとしている。 配列の処理の仕方を勘違いして覚えてたみたいです。 >戻り値は「ポインタ」を返しているのに、入れる先は「配列」。 ここらへんが理解できない部分です。ポインタと配列の仕組みが よくわかってないみたいです。

回答No.1

>このソースコードはコンパイルもできませんでした。 開発環境と、その時に出たエラーは? (wchar_tが使用できる環境なのか疑問)

TKOZ
質問者

補足

WindowsXP Pro でBCCDeveloperを使っています。 エラーは、 「エラー E2034 C:\Documents and Settings\HP\My Documents\c\aiueo00\main.cpp 43: 'wchar_t *' 型は 'wchar_t' 型に変換できない(関数 henkan() ) エラー E2277 C:\Documents and Settings\HP\My Documents\c\aiueo00\main.cpp 61: 左辺値が必要(関数 main() ) *** 2 errors in Compile *** ** error 1 ** deleting Debug\main.obj」と出ました。