• ベストアンサー

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

#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; } ローマ字から、ひらがなに変換するアルゴリズムを考えているのですが、 なかなかうまくいきません。このソースコードはコンパイルもできませんでした。 どうすれば、うまくいきますでしょうか?

  • TKOZ
  • お礼率38% (8/21)

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

  • ベストアンサー
  • 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」と出ました。

関連するQ&A

  • 文字列とポインタの問題です。

    #include<stdio.h> int f(char *s); int main(void){ char*str="nasida Institute of Technology"; int i; i=f(str); printf("%s:%d\n",str,i); return 0; } int f(char *s) { int j=0; while(*s!='\0'){ if(*s=='t'){ j++; } s++; } return j; } このプログラムの答えが3になるんですが、if文のとこの動作がよく分からないので、よろしくお願いします。

  • アルファベットを入力するとすべてのアルファベットを小文字に変換して出力

    アルファベットを入力するとすべてのアルファベットを小文字に変換して出力するプログラムを作成しました。2度以上同じ処理を行う場合はその部分を関数としなければいけないのですが、実行結果のように出力できませんでした。。どこが間違っているのでしょうか? 実行結果↓ ************ AOmori ==>aomori iwate ==>iwate AKITA ==>akita ************ #include <stdio.h> #include <string.h> #include <ctype.h> int henkan(void); int main(void) { char str[100]; int j,len; for(j=0;j<6;j++){ gets(str); printf("==>"); } henkan(); return 0; } int henkan(void) { char str[100]; int i, chk,len; for(i=0;i<len;i++){ chk=isupper(str[i]); if(chk!=0)str[i]=tolower(str[i]); { printf("%c",str[i]); } } printf("\n"); return chk; }

  • c言語についてです。

    文字の順番を逆さまにするプログラムなのですが実行してenterキーを押しても何もおこりません。原因がわかる方がいたら教えてほしいです。 初歩的な質問ですみません。 使っているパソコンはMacBookProです。 #include<stdio.h> void reverse(char[],char[]); void divide(char[],char[]); int main(void) { char s[100],t[100]; gets(s); reverse(s,t); divide(t,s); printf("%s %s\n",s,t); return 0; } void reverse(char s[],char t[]) { int i=0,j=0; while(s[i]!=0){ i++; } i--; while(i>=0){ t[j]=s[i]; i--; j++; } t[j]=0; return ; } void divide(char t[],char s[]){ int i=0,j=0; while(t[j]!=' '){ i++; } t[i]=0; i++; while(t[i]!=0){ s[j]=t[i]; j++; i++; } s[j]=0; return ; }

  • cプログラミングについて

    以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく 直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。 (間違えだらけで申し訳ありません) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 500 void mysort(char *word[MAXLINE]) { int i,j; char *tmp; for(i=0;;i++){ for(j=i+1;; j++){ if(strcmp(word[j],word[i])==1){ tmp=word[i]; word[i]=word[j]; word[j]=tmp; } } } } int main(void) { int i; FILE *fp; char str[MAXLINE]; fp= fopen("sample.txt", "r"); if (fp == NULL) { printf("fopen error\n"); exit(1); } while(( fgets( str, MAXLINE, fp )) != NULL) mysort(str); for(i=0;; i++) printf("%s\n", str[i]); return 0; }

  • C言語について教えてください

    ファイルの文を読み込み、I、Weなどの定めた単語の数を数えるプログラムを作りたいのですが、うまくいきません。 具体的な問題点は、単語の数を数える際、一致する単語があった場合、再び最初から文を見直すため、無限ループしてしまう。 We,WE、weなど大文字小文字の違いで単語が数えられないなどです。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char filename[FILENAME_MAX]; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; int w; char str[50]; FILE *fp; gets(filename); fp = fopen(filename,"r"); { if(fp==NULL) { printf("ERROR"); return -1; } } fscanf(fp,"%50s",str); for(w=0;w<=j+k+l+m+n+o;w++) { if(strcmp("I",str)==0) { j++; } if(strcmp("We",str)==0) { k++; } if(strcmp("You",str)==0) { l++; } if(strcmp("He",str)==0) { m++; } if(strcmp("She",str)==0) { n++; } if(strcmp("They",str)==0) { o++; } } printf("I: %d\n",j); printf("We: %d\n",k); printf("You: %d\n",l); printf("He: %d\n",m); printf("She: %d\n",n); printf("They: %d",o); fclose(fp); return 0; }

  • 大文字変換についてですが・・・

    初歩的なことですがよく分かりません。。 tokyoをTOKYOに大文字変換するプログラミング作成したいのですがどこを修正すればいいでしょうか? 初歩的な質問ですいませんがご教授お願いします。 #include <stdio.h> void henkan(char *a); void main(){ int i; char *aa="tokyo"; printf("%s\n",aa); henkan(aa); printf("%s\n",aa); } void henkan(char *a){ int i; char *b; b=a; while(*b!='\0'){ *b=*b+0x20; b++; } }

  • なぜかうまく表示されません(原因不明で困ってます)。

    キーを入力するとその入力された文字を表示する、 という単純なプログラムを作成しました。 そこで次のソースを見ていただきたいのですが、 下のこの状態ではうまくいきます。 ところが、余計についているはずの「int t;」を取ると、 表示される文字に余計なものがくっついてきてしまいます。 プログラムをどうみても「t」を使っている箇所はなく、 原因がさっぱりつかめません。 ソースの解読、大変お手数をおかけしますが、 原因を教えていただけないでしょうか。 よろしくお願いいたします。 ---------以下ソース------------- #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { while(1) { char i[40]; int t; i[0]=getch(); if(strcmp(i,"q")==0 || strcmp(i,"Q")==0) break; printf("%s ",i); } return 0; }

  • 文字列 数 変換

    数字列を数に変換できなかった男です。 以下はコンパイルエラー patn.c: In function 'input': patn.c:9:3: warning: function returns address of local variable [-Wreturn-local- addr] return (str); ^ 以下は実行後、 数を入力してください。 123.456 ・・,( 0.000000 0 0 以下は書いたプログラムです。 #include<stdio.h> #include<stdlib.h> char *input(void){ char str[100]; printf("数を入力してください。\n"); scanf("%s",str); return (str); } int main(void){ char *a; double d; int i; long l; a=input(); printf("%s\n",a); d=atof(a); i=atoi(a); l=atol(a); printf("%f %d %ld",d,i,l); return(0); } 関数input()にchar *str2; str2=str; return(str2);としても、実行後の表示はおかしいです。 123.456 123 123.456と表示したいです。御指摘お願いします。

  • C言語 strcmp 半角スペースがあるとだめ?

    C言語 strcmp 半角スペースが文字列に含まれている場合 文字列の比較がうまくいきません。半角スペースがあると比較できないのでしょうか? プログラム //strcmp #include <stdio.h> #include <string.h> int main(void){ char input[256]; char str[] = "HelloWorld!";   //char str[] = "Hello World!";だとうまくいかない。 printf("%s\n>", str); scanf("%s", input); if ( strcmp(input, str) == 0){ printf("同じです。\n"); }else{ printf("違います。\n"); } return 0; }

  • 文字列str内の全ての数字を削除する関数

    文字列str内の全ての数字を削除する関数 void del_digit(char str[]) を作成。 (例えば、"ab1C9"を受け取ったら、"ABC"にする) という関数を作りたいのですが、うまくいきません。 過去に似たような『文字列内の数字削除』の質問をされた方が いましたが、ポインタを使っていました。 http://okwave.jp/qa1775576.html ポインタを使わずにするには、どうしたらよいのでしょうか? 途中まで作ってみたのですが、うまく動きません。 #include <stdio.h> #include <ctype.h> void del_digit(char str[]) {     unsigned i = 0, j = 0;     char ctr[] = {'0'};     while (str[i] != '\0') {           ctr[i] = str[i];           i++;     }     i = 0;     while (ctr[i] != '\0') {           if (ctr[i] < '0' || ctr[i] > '9') {              str[j] = toupper(ctr[i]);              j++;           }           i++;     }     str[j] = '\0'; } int main(void) {     char str[100];     printf("文字列を入力してください:");     scanf("%s", str);     del_digit(str);     printf("%s\n", str);     return (0); }

専門家に質問してみよう