C/C++で漢字の読みを取得する方法

このQ&Aのポイント
  • C/C++で漢字の読みを取得する方法について紹介します。
  • kakasiを使用して漢字の読みを取得するプログラムの作成方法について説明します。
  • C/C++で漢字の読みを表示するためには、kakasiのDLLを読み込み、関数を使用する必要があります。プログラムのエラーチェックや環境変数の設定も重要です。
回答を見る
  • ベストアンサー

漢字の読みを表示するプログラム

漢字の読みを表示するプログラム C/C++で漢字の読みを取得したいです。 kakasiを利用してみましたが、以下のようなエラーになってしまいます。 エラー内容:実行時エラーで、「○○.exeは動作を停止しました。」となります。 OS:Vistaです。 環境変数はマニュアル通りに設定しました。 ソースはネット上のサンプルを参考に書きましたが、 LoadLibrary・GetProcAddressなどの関数の意味がmsdnを見ても解りませんでした。 (環境変数に設定しない場合の書き方なのかもしれないと思い、消してみましたが、 そうすると多数のコンパイルエラーになってしまいます。) まずは動かしてみたいのです。よろしくお願いいたします。 以下エラーが出るソースです。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "libkakasi.h" void main(void){ HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" ); char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" ); int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" ); putenv( "ITAIJIDICTPATH=C:\\kakasi\\share\\kakasi\\itaijidict"); putenv( "KANWADICTPATH=C:\\kakasi\\share\\kakasi\\kanwadict"); char* argv[] = {"kakasi", "-JH","-kH"}; kakasi_getopt_argv(3,argv); char* hiragana = kakasi_do("漢字"); printf("%s\n", hiragana); kakasi_free(hiragana); FreeLibrary(hKakasiDLL); }

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えぇと, つまり 「[入力]実行可能モジュール(.DLL または .EXE ファイル)の名前を保持する null で終わる文字列へのポインタを指定します。」 の意味がわからん, と?

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc429241.aspx

その他の回答 (1)

回答No.2

LoadLibraryの引数に書かれているのはフォルダのパスですよね? "C:\\kakasi\\bin\\kakasi.dll"ではないでしょうか。

関連するQ&A

  • C/C++で漢字の読みを取得したいです。

    C/C++で漢字の読みを取得したいです。 以下のコードで、エラーと警告は出ないのですが、実行時エラーになします。 実行時エラー:○○.exeは動作を停止しました。 どこが問題なのか解りません。 漠然としていて申し訳ありませんが、 ライブラリというものが何なのか解っていない初心者です。 Windouwsで設定も含めて、手順を教えていただけませんでしょうか。 おそらくひとつの回答では文字数が足りない程のだと思いますので、絞ると 1.libkakasi.hやkakasi.libなどの必要ファイルの置く場所 2.プロジェクトの設定 3.ソースコード を教えていただきたいです。 まずは動かしたいので理論的なことは後で調べようと思います。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "libkakasi.h" void main(void){ HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );; char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" ); int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" ); char* argv[] = {"kakasi", "-JH","-kH"}; kakasi_getopt_argv(3,argv); char* hiragana = kakasi_do("文"); printf("%s\n", hiragana); printf("%s\n", "a"); kakasi_free(hiragana); FreeLibrary(hKakasiDLL); } /* 1>------ ビルド開始: プロジェクト: oto_0714, 構成: Debug Win32 ------ 1>コンパイルしています... 1>oto_0714.cpp 1>リンクしています... 1>マニフェストを埋め込んでいます... 1>ビルドログは "file://c:\Users\me\Documents\Visual Studio 2005\Projects\oto_0714\Debug\BuildLog.htm" に保存されました。 1>oto_0714 - エラー 0、警告 0 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== */

  • C/C++で漢字の読みを取得したいです。

    C/C++で漢字の読みを取得したいです。 kakasiで以下のようなエラーになってしまいます。 ファイルの設定は ネット上のサンプルを参考にし、LoadLibrary・GetProcAddressなどの関数を使いました。 以下の実行時エラー・警告が出てしまいました。 どこが問題ないのか解りません。ご存知の方がおられましたら教えてください。よろしくお願いいたします。 1>------ ビルド開始: プロジェクト: oto_0714, 構成: Debug Win32 ------ 1>コンパイルしています... 1>oto_0714.cpp 1>c:\users\me\documents\visual studio 2005\projects\oto_0714\oto_0714.cpp(12) : warning C4996: 'putenv': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _putenv. See online help for details. 1> c:\program files\microsoft visual studio 8\vc\include\stdlib.h(900) : 'putenv' の宣言を確認してください。 1>c:\users\me\documents\visual studio 2005\projects\oto_0714\oto_0714.cpp(13) : warning C4996: 'putenv': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _putenv. See online help for details. 1> c:\program files\microsoft visual studio 8\vc\include\stdlib.h(900) : 'putenv' の宣言を確認してください。 1>ビルドログは "file://c:\Users\me\Documents\Visual Studio 2005\Projects\oto_0714\Debug\BuildLog.htm" に保存されました。 1>oto_0714 - エラー 0、警告 2==== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "libkakasi.h" void main(void){ HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );; char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" ); int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" ); putenv( "ITAIJIDICTPATH=C:\\kakasi\\share\\kakasi\\itaijidict"); putenv( "KANWADICTPATH=C:\\kakasi\\share\\kakasi\\kanwadict"); char* argv[] = {"kakasi", "-JH","-kH"}; kakasi_getopt_argv(3,argv); char* hiragana = kakasi_do("文"); printf("%s\n", hiragana); kakasi_free(hiragana); FreeLibrary(hKakasiDLL); }

  • DLL関数を使ったプログラム

     DLL関数を使ったプログラムを動かしたんですが、ERRORが解決できず 困っています。DLLを作成したのはいいのですが、それをLoadLibraryで読み込もうとしても指定したプロシージャが見つからないというエラーになるようです。使用している環境はVisual Studio.NET2003です。  以下はDLLのソースです。 // plug.c // #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK TestFunc() {    printf("DLLのTestFunc()関数が実行されました。\n"); } これをビルドするとplug.dllとplug.expとplug.libが作成されました。  そしてこれを使用したプログラムが // stab.c // #include <windows.h> #include <stdio.h> typedef void (*TestFunc)(void); void main() {     HMODULE hModule;     DWORD error;     TestFunc funcPointer;     hModule = LoadLibrary(TEXT("plug"));     error = GetLastError();//error値が127     funcPointer = (TestFunc)GetProcAddress(hModule,TEXT("TestFunc"));     funcPointer();     FreeLibrary(hModule);     getchar(); } LoadLibrary関数を使用してアプリのメモリ空間にDLLを読み込もうとしているんですが、ここでハンドルが正確に渡されていないみたいなんです。どうしてこうなるのか分かりません。わかる方いらっしゃったらよろしくお願いします。

  • Chasen.dllをBCB5で使う方法を教えてください(DLLの使い方)

    形態素解析ツールのChasen Win32版に付属しているchasen.dllを自作のプログラムから呼び出したいと思っています。 ・茶筅 http://chasen.aist-nara.ac.jp/index.html.ja ですが、DLLを使ったことがないのでよくわからずもう何日も困っています。 ヘッダで、まずDLL付属のヘッダー(下記参考資料)をインクルードして、 #include "chadll.h" 自作プログラムのソースで、 HINSTANCE chasenDLL = LoadLibrary("chasen.dll"); でライブラリをロードして、 char *myanalyze = (char *)GetProcAddress(chasenDLL,"analyze"); で関数analyzeを取り出していますが、 analyze()を実際に使うとシンボルの未解決エラーでコンパイルできません。 このDLLはBCBでは使えないのでしょうか。 ---------------------参考資料:DLL付属のサンプルソース /* * dlltest.c - ChaSen dll test program * * Copyright (C) 2000 Nara Institute of Science and Technology * * Author: H.Matsuda <horosi-m@is.aist-nara.ac.jp>, Sep. 2000 */ #include <stdio.h> #include "chadll.h" int main( int argc, char** argv ) { char input[10000] = "これは形態素解析のテストです。"; set_argument_parameters( argc, argv ); printf( "%s", analyze( input ) ); } ---------------------参考資料:DLL付属のヘッダーファイル /* * chasendll.h - ChaSen dll header * * Copyright (C) 2000 Nara Institute of Science and Technology * * Author: H.Matsuda <horosi-m@is.aist-nara.ac.jp>, Sep. 2000 */ __declspec( dllexport ) int set_argument_parameters( int argc, char** argv ); __declspec( dllexport ) char* analyze( char* input );

  • プログラムの説明

    C++の初心者です。 ↓のプログラムの動作はさっぱりわかりませんが、それについての説明は具体的に教えていただきたいです。(できれば、詳しく) #include <iostream> #include <string> int getNinzu(int ARGC, char *ARGV[]) throw (char const *){ if(ARGC!=2){ throw "Needs only one argument."; } int ninzu=std::atoi(ARGV[1]); if(ninzu<=0){ throw "Value is too small."; } return ninzu; } #include <cstdlib> #include <ctime> int randfive(){ static bool firsttime=true; if(firsttime){ firsttime=false; std::srand(std::time(NULL)); } return static_cast<int>(static_cast<double>(std::rand())/RAND_MAX*(5+1)); } #include <iomanip> int main(int ARGC, char* ARGV[]){ std::string cmdname=ARGV[0]; int ninzu; try{ ninzu=getNinzu(ARGC,ARGV); std::cout << std::setfill('0'); for (int i = 1; i <= ninzu; ++i) { int score = 0; for (int k = 0; k < 20; ++k) score += randfive(); std::cout << "C" << std::setw(5) << i << " " << score << '\n'; } }catch(char const *str){ std::cerr << str << std::endl << "Usage: " << cmdname << " ninzu" << std::endl; return 1; } }

  • [C言語]トラバースするプログラム(linux)

    linux(ubuntu11.04)でコマンドラインからもらったディレクトリをトラバースするプログラムを作りたいんですがうまくいきません。 一応書けたのですがどうも予想と違う動きをしてしまいます。 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<dirent.h> #include<string.h> static void do_traverse(char *patht, int t); int main(int argc, char *argv[]) { int i; if(argc<2) { fprintf(stderr,"%s: no arguments\n",argv[0]); exit(1); } for(i=1;i<argc;i++) { do_traverse(argv[i],0); } return 0; } static void do_traverse(char *path, int t) { DIR *d; struct dirent *ent; int i; d=opendir(path); if(!d) { perror(path); exit(1); } while((ent=readdir(d))!=NULL) { struct stat st; if(lstat(ent->d_name,&st)<0) { perror(ent->d_name); exit(1); } for(i=0;i<t;i++) { printf(" "); } printf("%s\n",ent->d_name); if((strcmp(".",ent->d_name))==0 || (strcmp("..",ent->d_name))==0 || S_ISLNK(st.st_mode)) { continue; } if(S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) { do_traverse(ent->d_name,t+1); } } closedir(d); } 例えばディレクトリaにファイルbとディレクトリcがあり、ディレクトリcの中にはファイルdとディレクトリeがあり、ディレクトリeの中にはファイルfがあるとします。 僕の理想では $./traverse a とすると .. . b c .. . d e .. . f となるはずなんですが(表示の順番は適当です)、実際は b .. . c となってしまいうまくトラバースしてくれません どうしてこうなるかわかりません 誰か助けてください お願いします

  • このプログラムの動作について教えてください

    #include<stdio.h> #include<unistd.h> #define SIZE 10 int main(int argc,char *argv[]){ int fd; char buf[SIZE]; fd=open("data",0); read(fd,buf,10) write(1,buf,10); close(fd); rerutn 0; } というプログラムで dataの中身が以下のテキストファイルとなっているようなのんですが dataの内容:abcdefghijklmnopqrstuvwxyz このプログラムの出力結果がabcabcabce となるとの事なのですが何故でしょうか? 普通に先頭から10バイト分読み込んで出力するならabcdefghijとなるのではないのでしょうか? どうぞご教授お願いします

  • 漢字を配列に入れたいのですが

    漢字を配列に入れたいのですが、うまくいきません。 3列、60行のcsvファイルを読み込んで配列に入れようをしているのですが、1列目、2列目、3列目にある漢字をそれぞれ配列に入れようとしているのですが、出力するとうまくいかないんです。誰か教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; unsigned int data1[60], data2[60], data3[60]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; ll= fgets(buff,MAXBUFFSIZE,fp); while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; j++; } printf("%s\n%s\n%s\n", data1,data2,data3); }

  • ソースプログラムのエラー

    自分で四則演算のプログラムを組んだのですが エラーが出てお手上げ状態です。 どこが間違っているのかどなたか教えていただけませんか?? ちなみに足し算の場合はいくつ足しても計算できるという プログラムです☆ #include<stdio.h> int main(int argc, char *argv[]){ int i,a=0,b=0,x=0; int m=0; if(argv[1]!="+"||argv[1]!="-"||argv[1]!="*"||argv[1]!="/"||){ printf("指定された文字ではありませんよ\n"); return -1; } a = atoi(argv[2]); b = atoi(argv[3]); if(argv[1]=="-"){ m=a-b; } if(argv[1]=="*"){ m=a*b; } if(argv[1]=="/"){ m=a/b; } if(argv[1]=="+"){ for(i=2;i<argc;i++){ x=atoi(argv[i]); m+=x; } printf("%d\n",m); return 0; }

  • プログラム(初心者)

    文字列を入力し中に含まれる空白を削除した文字列を作るプログラムなのですが #include <stdio.h> #include <stdlib.h> int main(void){ char str[100]; int i,j,c; printf("文字列を入力してください\n"); gets(str); i=j=0; do{ c=str[i++]; if(c!= ' ') str[j++]=c; }while(c); printf("空白を削除した文字列は%sです\n",str); return EXIT_SUCCESS; } do文の所何やってるかさっぱりわかりません 教えてください

専門家に質問してみよう