C言語とWin32APIで全角のカタカナの文字を取得、表示する方法

このQ&Aのポイント
  • C言語とWin32APIを用いて、全角のカタカナの文字を取得し、表示する方法について教えてください。
  • 具体的な手順として、ウィンドウを作成し、その中に全角のカタカナを入力し、入力した文字を描画する方法についてお聞きしたいです。
  • また、カタカナ以外の文字が入力された場合はエラーメッセージを表示し、クライアント領域には何も描画しないようにしたいです。
回答を見る
  • ベストアンサー

C言語とWin32APIで全角のカタカナの文字を取得、表示する方法について。

いつも、お世話になっております。 小生、只今、WinXPSP3上でC言語とWin32APIを使い、BCC5.5.1でコンパイルしながら、Windowsプログラミングを勉強しています。 今回、ご質問させて頂きたい内容は、 1.ウィンドウを作成。 2.1で作成したウィンドウに全角のカタカナを1文字入力。 3.入力されたカタカナを入力した箇所の下に描画。 4.再度、カタカナの文字があった場合は、入力されている文字を消去し、2のステップに戻る。 5.カタカナ以外の文字が入力された場合はメッセージボックスにて、   "カタカナ以外の文字が入力されました"を出現させ、クライアント領域には何も描画しない。 以上です。 前回、同じような質問を投稿させて頂いた際に、WM_CHARメッセージの箇所を工夫して利用し、文字を取得する方法をお教え頂いたので、WM_CHARメッセージでの処理の仕方をご教授願いたいと思っております。 そして、あつかましいようで申し訳ございませんが、ソースを記述して頂く際、C言語での記述で宜しくお願い致します。 以上です。 色々とわがままを言い、本当に申し訳ございません。 お忙しい中、本当に申し訳ございませんが、先輩方アドバイス宜しくお願いします。

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

  • ベストアンサー
回答No.5

う~~~~む 現在、IsKKANAがFALSEを返した場合のみ flag = 0; が適用されることになっていますが 実際には if(!flag && IsDBCSLeadByte((BYTE)wp)){ に対する elseで確実にflag = 0; としないとまずい可能性があるので flag = 0; を一つ外に出してみてください。 以下はそれでも無理な場合です。 ///////////////////// それ以外の個所に問題があるとすると、これは想像以上の難問かもしれません。 原因がちょっと分かりません。 私の環境では出来るために、コンパイラの違いによって何か予想外のことがが起きているか、あるいはまだ見落としてる裏仕様がありそうな気がします。 BCC5.5.1には公式のユーザーフォーラムとかはないのでしょうか? 面倒ではあるでしょうが もし本当にどうにもならないならVisualStudioの方を検討してみてはいかがでしょうか?(Express Editionなら無償です) http://www.microsoft.com/japan/msdn/vstudio/express/ HackHackさんが使用しているC言語の規格はC99ではないようなので VC++なら全部そのまま使えるはずです。 また、VisualStudioならば色々調べたりするのも簡単な可能性がより高いと思いますし、MSDNフォーラムという場も提供されています。 http://social.msdn.microsoft.com/Forums/ja-JP/categories BCC5.5.1でなければならないならば、それに詳しい人がいる場所を探し出して質問してみてください。

HackHack
質問者

お礼

LongSecretさん、本当にお世話になり、誠に恐縮です。 ここまで、ご協力して頂いて、本当に心から感謝しています。 >flag = 0; >を一つ外に出してみてください。 ご提示して頂いた内容通りに、コードを改変しコンパイルしてみたのですが、やはり駄目でした。 LongSecretさんの仰る通り、別の開発環境での開発も考えてみます。 (今、勉強している"猫でもわかるWindowsプログラミング第2版"を全て読み終えてから環境を変えようと思っています。) 本当にここまでご教授頂き、誠にありがとうございます。 出来うる事なら、実際にお会いし、ありがとうございましたとお礼したいです。 何度もすいませんが、本当にありがとうございました。

その他の回答 (4)

回答No.4

>何度もコードを見直し、間違いがないか確認し、 >濁点、半濁点の文字を入力してみたのですが、やはり"カタカナ以外のメッセージボックス"が出現します。 これはコンパイルできているということだと思うので、IsKKANA関数は実際には上で定義されているか、前方宣言されていますよね? という前提で 私の環境だとこれでも出来てしまうので 原因はよく分かりませんが 再提示していただいたコードだと No.3の注意事項を満たしていません(フラグがありません) ので、そこで失敗している可能性はありませんか? とりあえず、No.3のとおりに変数を一つ追加しつつ判定を万全に整えて あとはこれは関係ないと思いますが、念には念のため WM_PAINT内での index = 0; を取り払ってみてください。 それでもできなかったら、 一端No.1に書いた、カタカナ一文字でない、普通に一気に表示される、という方法が正常に出来ることを確認した後 問題の発生している現在のコードをデバッグしてみて、どの行でどうなるのか、一行一行追って行って、原因と思われる行はどれかを絞り込んでください。

HackHack
質問者

補足

LongSecretさんご回答頂き誠にありがとうございます。 このトピックに関して、5日間程、自分で調べたのですが、 どうしてもバグが発生している箇所がわかりません。。。 デバッグしようにも、Turbo Debugger5.5が手元に無いのもあり、 ネットで探してもありませんでした。 ご提示して頂いた通り、コードも修正し直しました。 No1のコードがうまく走るのも確認致しました。 しかし、一文字目に濁点、半濁点の文字を入力しても、 "カタカナ以外の文字が入力されました。"のメッセージボックスが出現します。 二文字目以降に濁点、半濁点の文字を入力した際は、 メッセージボックスが出現しません。 以下に訂正した、コードを提示させて頂きます。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; static char buf[BUFSIZ] = {0}; static int index = 0; static BOOL flag = 0; switch(msg){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 0, 30, buf, strlen(buf)); EndPaint(hWnd, &ps); break; case WM_CHAR: if(!flag && IsDBCSLeadByte((BYTE)wp)){ index = 0; buf[index++] = (char)wp; flag = 1; } else{ buf[index++] = (char)wp; if(!IsKKANA(buf)){ buf[index = 0] = 0; MessageBox(hWnd, "カタカナ以外の文字が入力されました。", "エラー", 0); flag = 0; } } InvalidateRect(hWnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wp, lp); } return 0; } BOOL IsKKANA(const char *p_buf) { static const WORD sci[] = { 'ヴ', 'ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'べ', 'ボ', 'パ', 'ピ', 'プ', 'ぺ', 'ポ' }; WORD w[10]; int i; GetStringTypeEx(LOCALE_SYSTEM_DEFAULT, CT_CTYPE3, p_buf, -1, w); if(w[0] == (C3_ALPHA | C3_FULLWIDTH | C3_KATAKANA)){ return TRUE; } for(i = sizeof(sci) / sizeof(sci[0]);i--;){ if((WORD(p_buf[0] << 8) | p_buf[i]) == sci[i]){ return TRUE; } } return FALSE; } 本当に申し訳ございませんが、LongSecretさんしか頼る方がいません。 どうかご協力お願い致します。 再度、アドバイス宜しくお願い致します。 ご迷惑お掛けして申し訳ございません。

回答No.3

もうひとつ重要な情報を見つけました。 http://bbs.wankuma.com/index.cgi?mode=al2&namber=3522&KLOG=12 ということだから IsDBCSLeadByte だけでは不足ですね。 変数の型が分からなかったのでうやむやになって読み解ききれませんでしたが、おそらく miswaki7Zさんが値を保存していた理由はここにあると理解しました。 (ですよね?) というわけで、下記コード上で最短表記すると プロシージャ内に static BOOL flg=0; を増やし if(IsDBCSLeadByte((BYTE)wp) ){ から始まる部分を if( !flg && IsDBCSLeadByte((BYTE)wp) ){ /* その他 */ flg = 1; }else{ /* その他 */ flg=0; } といった風に書き加える作業も必要ではないかと思います。 これで、上のブロック内に入るのは確実に最初のバイト、ということになるのではないかと(少なくとも今回の場合は) …まだ穴があるかもしれませんが、リンク先のサイトの記述をみるとたぶんOKだと思います。 ただし、IsDBCSLeadByteはあくまで ダブルバイト文字セット用の関数なので、それ以外の文字が入ってくると無理かもしれません。

HackHack
質問者

補足

LongSecretさんには、本当にお世話になり、ご丁寧にご教授頂き、誠にありがとうございます。 早速、ご提示されたコードと解説を元にプログラミングに励んでみます。 心より感謝申し上げます。

回答No.2

カタカナ限定、ということならば (その予定ではあまりなかったのであんまりまともなコードを書いてません。というより、文字コードが絡むと状況に依存するコードになりやすいと思うので、なるべくそういうコードを書かないようにしてきたので、そんなに詳しく知りません。ただ) それについては間違いなくGetStringTypeEx周りが絡んでいます。 濁点や半濁点の数値を確認してみてください。 私の環境では文字コードの正確な規格(バージョンとか?)は分かりませんが 後ろのバイトが濁点だと1多くて半濁点だと2多かったです。 しかし、そういう風にコーディングするのは知り尽くしてない限り(確実にそのことが保証されてるかどうか分かってないと)その都度ちゃんと文字コードを調べないといけません。 かといって、WindowsAPIだと実装が見えないので、MSDN見ても分からないような見えないバグとの格闘が出てくるかも。 対象とする文字コードを限定していただければ、そういうことに詳しい方に答えていただけるかもしれません。(重要) ここでは仮に「GetStringTypeExが、濁音と半濁音に対応できない、のならば」という前提での話をします。 また、カタカナが2バイトで、かつマルチバイトで、かつリトルエンディアンである限り安全なはず と思うコードです。 if(w[0] != (C3_ALPHA | C3_FULLWIDTH | C3_KATAKANA)){ の行を if(!IsKKANA(c)){ に変えてください。(その場合static WORD w[10];は不要です) そしてこの関数はこのように定義しておきます。 BOOL IsKKANA(const char* c){ static const WORD sci[]={ 'ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド' //以下略・・・ }; WORD w[10]; GetStringTypeEx(LOCALE_SYSTEM_DEFAULT, CT_CTYPE3, c, -1, w); if(w[0] == (C3_ALPHA | C3_FULLWIDTH | C3_KATAKANA)) return 1; for ( int i=sizeof(sci)/sizeof(sci[0]); i--; ) if ((WORD(c[0]<<8)|c[1])==sci[i]) return 1; return 0; } その他、必要な文字を付け足します。 もしここに全て入れてしまえばGetStringTypeExは不要です。 対処療法的ではありますが、上記前提中でさらにcに渡されるアドレスがあってさえいれば問題はないと思います。 ただ、ここまで書いておいてなんですが タイピングソフトなら、日本語入力OFF状態を確定させておいて、半角アルファベットで判定した方が制御もコーディングもかなり楽だと思います。

HackHack
質問者

補足

ご回答頂き、誠に感謝申し上げます。 自分の環境で文字コードを調べてみたところ(Shift-JISです) ヴは0x8394でパは0x8370でした。 そして提示して頂いた、コードを元に自分のコードを修正してみました。 以下に記述させて頂きます。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; static char buf[BUFSIZ] = {0}; static int index = 0; switch(msg){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 0, 30, buf, strlen(buf)); index = 0; EndPaint(hWnd, &ps); break; case WM_CHAR: if(IsDBCSLeadByte((BYTE)wp)){ index = 0; buf[index++] = (char)wp; } else{ buf[index++] = (char)wp; if(!IsKKANA(buf)){ buf[index = 0] = 0; MessageBox(hWnd, "カタカナ以外の文字が入力されました。", "エラー", 0); } } InvalidateRect(hWnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wp, lp); } return 0; } BOOL IsKKANA(const char *p_buf) { static const WORD sci[] = { 'ヴ', 'ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'ビ', 'ブ', 'べ', 'ボ', 'パ', 'ピ', 'プ', 'ぺ', 'ポ' }; WORD w[10]; int i; GetStringTypeEx(LOCALE_SYSTEM_DEFAULT, CT_CTYPE3, p_buf, -1, w); if(w[0] == (C3_ALPHA | C3_FULLWIDTH | C3_KATAKANA)){ return TRUE; } for(i = sizeof(sci) / sizeof(sci[0]);i--;){ if((WORD(*p_buf << 8) | *(p_buf + 1)) == sci[i]){ return TRUE; } } return FALSE; } 以上です。 何度もコードを見直し、間違いがないか確認し、 濁点、半濁点の文字を入力してみたのですが、やはり"カタカナ以外のメッセージボックス"が出現します。 以上、ご確認の程、お忙しい中申し訳ございませんが、ご教授よろしくお願い致します。

回答No.1

確か本来の目的はタイピングソフトの機能を実現する、という感じでしたよね? おそらく「一文字」にこだわるほうが難しいと思うのですが、入力したのを全部受け取って一気に表示してはダメなのでしょうか? もしそれでOKなら static char c[100]={0}; static int Index=0; static HDC hdc; static PAINTSTRUCT ps; これらをプロシージャ先頭で用意しておいて WM_CHAR側は case WM_CHAR: c[Index++]=(char)wParam; c[Index]=0; if (Index==99) Index=0; InvalidateRect(hWnd,NULL,TRUE); return 0; これぐらいやれば確認には十分と思います。 あとは書くだけですが、それについては重要なのはTextOutやDrawText一文だけです。 case WM_PAINT: hdc=BeginPaint(hWnd,&ps); TextOut(hdc,0,30,c,strlen(c)); EndPaint(hWnd,&ps); return 0; などなど 一気に入力してOKならば、これだけで出来ると思います。 応用として バックスペース押したら戻るとかも上記 case WM_CHAR:の直後に if (VK_BACK==wParam) { if (Index) --Index; c[Index]=0; InvalidateRect(hw,0,1); return 0; } とか書き加えておけば出来ます (もちろん、ANSI前提のコードなので、その文字が一バイトでなければもうちょっとまともに判定を作らないと中途半端に消したとき変な文字が出るでしょうが) もしやはり「カタカナ一文字」でなければならないなら 前の質問でmiswaki7Zさんが回答していらっしゃるコードを少しいじればC準拠になるかと思いますが 今回の題意に沿わせると・・・ 相当削ってもWM_CHARで case WM_CHAR: if ( IsDBCSLeadByte((BYTE)wp) ) { Index=0; c[Index++]=(char)wp; } else { c[Index++]=(char)wp; WORD w[10]; GetStringTypeEx(LOCALE_SYSTEM_DEFAULT , CT_CTYPE3 , (LPCTSTR)c , -1 , w); if(w[0] != (C3_ALPHA | C3_FULLWIDTH | C3_KATAKANA)){ c[Index=0]=0; MessageBox(0,"カタカナ以外の文字が入力されました","",0); } } InvalidateRect(hWnd,NULL,TRUE); return 0; これくらいは必要になるんじゃないかな? …んでもこのコードだとまだ特定の状況に対処できていないため、もっとまともにやるならもうちょい増えるだろうし…

HackHack
質問者

補足

再度、ご質問したのにも関わらず、ご親切、丁寧にご回答頂き、誠に感謝もうしあげます。 今回LongSecretさんのアドバイスの元、下記のコードを記述し、 無事にカタカナ1文字だけを取得し、表示するコードを作成することが出来ました。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; static char buf[BUFSIZ] = {0}; static int index = 0; static WORD w[10]; switch(msg){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 0, 30, buf, strlen(buf)); index = 0; EndPaint(hWnd, &ps); break; case WM_CHAR: if(IsDBCSLeadByte((BYTE)wp)){ index = 0; buf[index++] = (char)wp; } else{ buf[index++] = (char)wp; GetStringTypeEx(LOCALE_SYSTEM_DEFAULT, CT_CTYPE3, (LPCSTR)buf, -1, w); if(w[0] != (C3_ALPHA | C3_FULLWIDTH | C3_KATAKANA)){ buf[index = 0] = 0; MessageBox(hWnd, "カタカナ以外の文字が入力されました。", "エラー", 0); } } InvalidateRect(hWnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wp, lp); } return 0; } しかし、"ド"、と入力すると、"カタカナ以外の文字が入力されました"のメッセージボックスが出現します。 以上、本当に申し訳ございませんが、再度、アドバイス宜しくお願い致します。

関連するQ&A

  • C言語とWin32APIで全角かなの文字を取得する方法について。

    いつも、お世話になっております。 小生、只今、WinXPSP3上でC言語とWin32APIを使い、BCC5.5.1でコンパイルしながら、Windowsプログラミングを勉強しています。 今回、ご質問させて頂きたい内容は、 クライアント領域において、全角かなの文字を取得する方法についてです。 自分自身で考えてみたのですが、WM_CHARメッセージの箇所を工夫して利用し、文字を取得する方法と、エディットコントロールにて文字を取得する方法です。 自分自身、WM_CHARメッセージを最近、勉強し始めたところなので、 出来ればWM_CHARメッセージを使用し、処理してみたいのですが。。。 以上です。 お忙しい中、本当に申し訳ございませんが、先輩方アドバイス宜しくお願いします。

  • C言語で全角文字を扱いたいのですが、

    C言語で全角文字を扱いたいのですが、 全角文字列を入力して特定の箇所の文字(例えば3文字目)を抜き出して、表示するという感じのプログラムをしたいのですが、うまくいきません。 半角文字ならば、配列を使ってできるのですが・・・・・

  • C言語で取得した文字列を、C++の文字列として取り扱いたいです。

    C言語で取得した文字列を、C++の文字列として取り扱いたいです。 皆さんこんにちは。 C言語で取得したchar型で定義された文字列を、 C++の「std::string」に渡したいと思っております。 どうすればかなうでしょうか? 具体的には次のような内容です。 ■C言語側 ---- char key1 = "deperture"; ---- ■C++側で「key1 = key2」としたいです。 ---- std::string key2 = key1; ---- C言語側で記述されている「key1」の値(deperture)を、 C++ソース内の「key2」に渡したいと思っています。 こうゆう場合、どんな方法をとれば適切でしょうか。 C言語側でのchar型の文字列の値を、 C++側の「std::string」型として C++のソースへ渡す方法が分からないです。 アドバイスいただけるとありがたいです。 簡単な例を頂けると更に大変ありがたいです。 以上どうぞ宜しくお願い致します。

  • Win32APIを使って入力されたキーによって表示する画像を変えるプログラムについて

    Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、 上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hMemdc,hbitmap); GetObject(hbitmap,sizeof(BITMAP),&bitmap); BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); } という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。

  • C言語win32api、エディットボックスから文字列を取得しメッセージ

    C言語win32api、エディットボックスから文字列を取得しメッセージボックスへ出力 質問1 エディットボックスからフォーカスが外れると その中の文字列を取得しメッセージボックスに出力したいのですが 思った通りに出力されません。 フォーカスが外れるとメッセージボックス自体は出てくるのですが エディットボックスに入力した文字列が出力されません。 いろいろ試したんですが文字化けしたり文字列自体が表示されなかったします。 取得と出力の方法を教えていただけませんでしょうか。 kwt[3]=CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("EDIT"), NULL , WS_CHILD | WS_VISIBLE | WS_BORDER |ES_LEFT | ES_AUTOHSCROLL , 90 , 85 , 110 , 25 , hAdd ,(HMENU)EDIT_ID02 ,((LPCREATESTRUCT)(lp))->hInstance , NULL); LPSTR testtex=NULL; LRESULT CALLBACK SubProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { LPSTR testtex=NULL; switch(msg) { case WM_COMMAND: switch(LOWORD(wp)) { case EDIT_ID02: if(HIWORD(wp)==EN_KILLFOCUS) //フォーカスが外れたら次の処理をする。 { strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2); //文字数分のメモリを確保 if(testtex) //testtexがゼロでなければ次の処理をする { GetWindowText(hwnd , testtex , GetWindowTextLength(hwnd) + 2); //エディットのテキストを取得。問題個所 MessageBox(hwnd , testtex , TEXT("") , MB_OK); //取得したテキストをメッセージボックスで出力。問題個所 } free(strText); //メモリを解放 return 0; } return 0; } return 0; } return (CallWindowProc(SubP1, hWnd, msg, wp, lp)); } 質問2 エディットボックスに0~9と「.」(ドット)のみを入力できるようにしたいのですが ウインドウスタイルでES_NUMBERを指定すると「.」が入力できなくなってしまいます。 どのように回避したらいいのでしょうか。 質問3 win32apiとは直接関係ありませんが、たとえば計算結果が1000億を超えるような場合 int型とかの変数ではとても入りきれません。 こういった場合どのようにするのでしょう。

  • c言語win32apiで孫ウインドウからメッセージ処理ができません。

    c言語win32apiで孫ウインドウからメッセージ処理ができません。 親ウインドウを作りその中に子ウインドウを作りさらに孫ウインドウを作りました。 以下のような感じです。 -- 親ウインドウ(A)親はNULL ↓ 子ウインドウ(B)親はA ↓ 孫ウインドウ(C、プッシュボタン)親はB で、孫ボタンをクリックしたらwindprocにWM_COMMANDメッセージが飛ぶと思っていたんですが まったく反応しません。 試しに親をAに変更したらちゃんと動きました。 孫ウインドウからwindprocにメッセージを飛ばすにはどうしたらいいんでしょうか。 それとも何か特別な方法があるんでしょうか。 開発環境はVC++ExpressEdition2008を使っています。

  • うまく表示されない。(API・C言語)

    C言語でAPIのプログラミングを行っている者です。 ソースはこちらとなります。 http://onegaisimasune.web.fc2.com/main6.txt mux2.vはこちらです。 http://onegaisimasune.web.fc2.com/main5.txt そこで、二つ程今のとこバグがあり、 1つ目は何度かウィンドウ上で左クリックしていると、 23回目くらいの所でウィンドウ上の文字が消えてしまう、 と言う問題と、 2つめはウィンドウを画面の外に追い出すと ウィンドウ上の文字が消えてしまうというものです。 どこが問題なのか、ご指摘願います。 どうか宜しくお願い致します。

  • printfで全角カタカナが文字化け?

    C言語において、printf関数をつかって全角カタカナを表示しようとすると、文字化けが発生します。 puts関数を使うと文字化けは発生しないので、使用上は特に問題は無いのですが、原因は何でしょうか?文字コードに起因するものでしょうか? ちなみに、OSはRedHatLinux9を使用しています。 宜しければ、回答お願い致します。

  • C言語で文字列をかえす正しい書き方が知りたいです?

    C言語で次の警告が表示されます。 文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか? jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。 char *test(char *a, int b) { char str[BUFSIZ]; return str; <------ }

  • C言語・Windows 文字の出力ができない

    C言語でWindowsプログラミングをしているのですが、文字がうまく扱えなくて困っています。 txtファイルから読み込んだ文字を"@@"のところで区切って、ウィンドウに描画するだけなのですが、うまくできません。 例) contents.txtファイル(以下中身です。) データ整理@@ファイル、フォルダをインポート@@アドレスからインポート@@txtとpdf(html,jpg,bmp)を等価に扱う@@検索@@タグ これをウィンドウに  データ整理  ファイル、フォルダをインポート  アドレスからインポート  txtとpdf(html,jpg,bmp)を等価に扱う  検索  タグ というように表示したいのですが、なぜか  データ整理  ファイル、フォルダをインポートアドレスからインポート  アドレスからインポート  txtとpdf(html,jpg,bmp)を等価に検索  検索  タグ のように表示されてしまいます。 (二段目と四段目がおかしくなっています、書き間違えではないです、念のため) 初心者なので、勉強不足による些細な間違いかもしれませんが、なにとぞ知恵をお貸しくださいm(_ _)m 以下、ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型は問題ないと判断しました。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int i = 0, j = 0, k = 0; int fp; HDC hdc; PAINTSTRUCT ps; char script[1000]; static char title[100][30]; switch (msg){ //ウィンドウ生成時 case WM_CREATE: fp = Reading("./contents.txt", script); if(fp == -1){ MessageBox(hWnd, (LPCSTR)"contents.txtが存在しない", (LPCSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION); }else{ for(;;){ if(script[i] == '\0'){ title[j][k] = '\0'; break; }else if(script[i] == '@' && script[i+1] == '@'){ title[j][k] = '\0'; i += 2; j++; k = 0; }else{ title[j][k] = script[i]; i++; k++; } } for(i = 0; i <= j; i++){ } } break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SetBkMode(hdc, TRANSPARENT); for(i = 0; i <= j; i++){ TextOut(hdc, 0, MOJI_SIZE * i, (LPSTR)title[i], strlen(title[i])); } EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //読み込み int Reading(const char* filename, char* script) { int pos = 0; char c; //スクリプトファイル FILE* fp; //スクリプトファイルを開く fp = fopen(filename, "r"); if( fp == NULL ) { //ファイル読み込みに失敗 return -1; } for( ;; ) { //一文字読み込み c = fgetc( fp ); //ファイルの終わりかどうか if( feof( fp ) ) { script[pos] = '\0'; break; } //改行文字が出てきた場合,無視 if( c != '\n' && c != '\t' ) { //書き込み script[pos] = c; //文字書き込み位置をずらす pos++; } } fclose(fp); return 0; }