いま普通なスキャナとプリンタを使って、マークシートの作成や読取ができるみたいです。
普通紙マークシート採点システムのようなソフトもあります。↓
http://www.vector.co.jp/soft/winnt/business/se39 …
そのソフトをインストールして、C言語で作れたことが分かりました。スキャナを使用し、回答用紙をjpgなどの画像ファイルに保存して、ソフトで採点できるんです。
私はC言語があまり分かりませんので、ここで聞きたいです。
(1)上記のようなソフトはどういう風にマークの正か誤かを判断しますか?画素ごと判断ではないでしょうか、鉛筆のマークの厚さや形状が違うと思いますが、どう解決しますか?
(2)JAVAで簡単な採点システムを作りたいですが、できますか?どういうふうにやれば実現できますか。

自分の力で解決できない問題が多いですね、経験がある方のアドバイスを是非いただきたいと思います。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

作ったことはないですし、作りきれる自信もないですが(^^;


画像の連続読み込みさえ出来れば、そんなに難しくはないと思います。
まず、白黒で読み込みますが、黒部分は、確実に黒に、塗りつぶす枠は、白になるように、汚れなどがある場合も白になるようにスキャナの明るさ調整をします。
(出来なければ、ソフト側でしきい値調整をし、白黒にします)

マークシートを見れば、原理はわかると思いますが、
シートには、シートの位置マークがまず付いていると思います。
これで始点と終点、座標が確定するわけです。
これは、シートの一番端の辺りにあるはずですから、端のあたりにある同一マークを検索します。
多分、斜めになったりなども有り得るので、斜めになった時用のデータも持って、位置検索しますが、
通常それはマークシートに最初からプリントされているものなので、
80%~90%くらいの確率で同じデータになればいいと思います。
ここで、画像を回転移動させて、検出位置データを塗りつぶしのチェック位置に持っていくか、
位置データーから塗りつぶしチェック位置を計算させるかは好みです。

位置データが出れば、必要なマークを書く位置は決まっているはずなので、各位置の塗りつぶし状況を見れば、いいだけです。
ここも、何%くらいで良いことにすればいいかはカットアンドトライでしょうか。
イメージセンサーなどにならえば、最初、200% 位の枠で見て、次 100% 位の枠で見て、最後に 50% 位の枠で見て、などと段階的に厳しくしていくなどの手法が多いようです。
200% -> 50~150
100% -> 50~100
50% -> 40~50
どれもパスすれば、塗りつぶしてあると判断でいいのではないかな。
(200% 時に 150 以上になるようでは、エラーですが。)

後は検出した位置データに沿って、データを格納していくだけです。
    • good
    • 0
この回答へのお礼

TERABITさん、ご回答ありがとうございます。

私は作りたいのは、普通紙のマークシート採点システムです。いろいろ調べましたが、確かに紙の右と下●か■のようなマークを付いたら、マークの範囲を判断しやすいみたいですね(私はまだこの判断方法については分かりません)。

>200% -> 50~150
>100% -> 50~100
>50% -> 40~50
>どれもパスすれば、塗りつぶしてあると判断でいいのではないかな。
>(200% 時に 150 以上になるようでは、エラーですが。)
上記の数字の意味がよく分かりませんが、もうちょっと詳しく教えていただけませんか。

私はJAVAを使って採点システムを作ると思いますので、これについてのアドバイスなどもいただければと思います。

よろしくお願い致します。

お礼日時:2009/05/15 21:21

No.1です。



>採点システムの仕組みは大体分かりましたが、実際にソフトを作る時、どんなクラスを使うとか、黒マークの判断とか、分からないことがまたあります。
>その具体的な内容は、やはり画像処理の本を読んだほうがいいですよね。
そうですね。
使用する(言語などの)開発環境により、手順は変わってきますので、それに合わせて調べるなり質問するなりは行ったほうがいいと思います。

>SilverThawさんの回答によって、こんな採点システムはそんなに難しいものではないでしょうか、1ヶ月くらいできますか。
質問者さんのプログラムスキルなどがわからないので何とも言えませんが、
行うこと(作らなければいけない機能)を理解していて、その作成方法がわかっていれば、一か月でできかもしれません。
但し、No2.で書いたとおり、「付加機能」をどこまでつけるかということによっても難易度は変わってくると思います。
    • good
    • 0
この回答へのお礼

SilverThawさん、何度のご回答をいただき、ありがとうございます。

私はJAVAを使ってこの採点システムを開発したいと思います。JAVAのレベルもそんなに高くないし、今の段階では私一人でやりますし、あまり自信がありません。

SilverThawさんはなにかアドバイスがあれば、是非教えていただきたいと思います。

よろしくお願い致します。

お礼日時:2009/05/15 21:14

No.1です。


>もう一つ分からないことですが、マークの部分として指定された範囲はどういうふうに指定できますか。
>プログラミングでどういうふうにこの範囲を判断できますか?もしかして「座標」みたいのものですか。
はい、座標です。

概要だけ説明すると、マークシートの用紙の大きさが分かっているのであれば、
・「左からXcm、上からYcm」のところを「横Acm、縦Bcm」の範囲で確認する。
・用紙全体を「横にX分割」「縦にY分割」して、左上から「X1,Y1」の部分を確認する(分割数で確認する範囲はわかる)。
といった方法が考えられます。

さらに細かく考えると、
五択とか三択などのように複数の中から1つだけ(複数選択は不可)や複数選択可の場合をどうするか
といったことを考えていくと……
    • good
    • 0
この回答へのお礼

SilverThawさん、ご回答ありがとうございます。

採点システムの仕組みは大体分かりましたが、実際にソフトを作る時、どんなクラスを使うとか、黒マークの判断とか、分からないことがまたあります。その具体的な内容は、やはり画像処理の本を読んだほうがいいですよね。

SilverThawさんの回答によって、こんな採点システムはそんなに難しいものではないでしょうか、1ヶ月くらいできますか。

お礼日時:2009/05/15 17:59

(1)


理屈的には、読み込んだ画像情報を2値(黒/白)化してマークの部分として指定された範囲に対しての黒の割合が一定以上であればマークされたと判断する。

(2)
・JPEG画像を読む
・上記(1)の内容を行う
ができれば可能です。
    • good
    • 0
この回答へのお礼

SilverThawさん、ご回答ありがとうございました。

もう一つ分からないことですが、マークの部分として指定された範囲はどういうふうに指定できますか。プログラミングでどういうふうにこの範囲を判断できますか?もしかして「座標」みたいのものですか。

お礼日時:2009/05/15 13:23

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qマークシート読み取り方法

マークシートの読み取り方法について教えてください。
本日、大切な試験がありマークシートでした。試験開始すぐに回答用紙の下にある黒い点々の間に、すごく小さな字で記憶にある計算式を忘れないうちにと書いてしましました。試験は回答したところ100点で全問正解しておりましたが、読み取りの際そのメモが原因で読み取れないということはないでしょうか?マークは、きっちり鉛筆にて塗りつぶしましたが少し心配になりましたので質問させて頂きました。どなたか詳しい方よろしくお願いします。JAマン

Aベストアンサー

慎重に言えば、機械的にはOKでも、採点基準で「解答用紙に解答以外の記載をしてはならない。」となっていたら、良くて減点、悪ければ失格でしょう。

大丈夫だとは思いますが、結果がでるまでわかりません。

QC言語C++言語アセンブラ言語の就職先

自分は以前Javaプログラマをやってました。

あまりに、便利なライブラリばかりで、「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」とおもってしまい、すきになれませんでした。正直、苦痛でした。

今、上記言語を勉強しているのですが、コンピュータの根本からプログラムをしている実感が沸き、とても面白いです。

でも、これらの言語を習得したところでどんなところに就職できるのかさっぱりわかりませんし、需要があるのかもしりません。いわゆる組み込み系統は就職できるんでしょうが、私としてはアルゴリズムでUNIXのプログラムをシコシコ書いているような作業がすきなのです。いってみれば、私はクラシックな人間だとおもいます。

そんな僕ですが、就職先はあるのでしょうか?よろしくお願いします。

Aベストアンサー

 勉強熱心ですね。
 実際に、kamkamkam3-san の言われている、
「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」というのは的を得ています。
 
 経験からなんですが、ソフトウェア会社では、ノウハウとしてライブラリをもっています。ちょうど、Java のクラス・ライブラリーなようなものです。ですから、それらを使って製品を効率良く製品をつくれるかが重要です。実際のソフトウェア・エンジニアは、それをうまく使って効率良くコーディングすることを要求されます。

 ソフトウェア業界は、1人で閉じた製品を開発することは、まずないです。製品=プロジェクトだとすると、最低3名~100人以上が同時進行となります。そうなると、割り当てられたノルマを効率良く行うかが評価のポイントになります。つまり、「ソフトウェアの振る舞いを書いているだけ」ということにもなります。

 コンピュータ言語は、あくまでもツール(道具)です。
 kamkamkam3-san が、今後どういった分野の仕事を希望している(興味がある)かが重要だと思います。
 その答えとして、「C言語C++言語アセンブラ言語」を勉強することで実感できると思います。ですので、ぜひ、勉強を続けてください。

 勉強熱心ですね。
 実際に、kamkamkam3-san の言われている、
「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」というのは的を得ています。
 
 経験からなんですが、ソフトウェア会社では、ノウハウとしてライブラリをもっています。ちょうど、Java のクラス・ライブラリーなようなものです。ですから、それらを使って製品を効率良く製品をつくれるかが重要です。実際のソフトウェア・エンジニアは、それをうまく使って効率良くコーディングすることを要求さ...続きを読む

Qマークシートの読み取りに関する質問です。

マークシートの読み取りに関する質問です。

本日教員採用試験を受けました。
全問マークシートでの回答でした。
本来ならば、カッコ内に[-]と、横線を一本引けばいいところを、今までの資格試験等のクセで、カッコ内をすべて塗りつぶしてしまいました。
前半の試験が終わってから、その間違いに気付きました。
マークの仕方の例には、「悪い例」のほうに、塗りつぶす例が掲載されていました。

マークが薄かったりはみ出すよりかは、まだしっかりと塗っているからいいんじゃないか、などと気休めの言葉を必死に自分にかけているのですが、一年間この日のために勉強してきたために、とても不安です。

本来[-]とカッコ内に線を一本マークすべきマークシートで、そのカッコ内をすべて塗りつぶした場合、機械はマークを読み取ってくれるのでしょうか。
どなた様か、お詳しい方、ご回答いただけると助かります。
よろしくお願いします。

Aベストアンサー

>そのカッコ内をすべて塗りつぶした場合、機械はマークを読み取ってくれるのでしょうか。

読み取ります。

以前、OMR(マークシート読み取り装置)を使用したシステム開発に携わっていたのですが
その時の経験からお話します。

読み取りにくい(機械がノーマークと判別してしまう)例としては、
薄い線や印(○印やレ点)でマークしているもの、

また誤読される例としては、誤った場合の消し方が不十分なものや、
消しゴムカスなどの汚れが付着しているものなどがあります。

きちっと塗りつぶすのが「悪い例」となっているのはあまり聞いたことがありません。

読取装置のメーカーや機種などによって多少は異なるでしょうが、
質問者様が仰る通り、薄かったりはみ出している訳ではないので問題はないはずです。

QC言語エラーの解決法教えてください。

以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか?
1 IntelliSense: 識別子 "WSAData" が定義されていません
2 IntelliSense: 識別子 "wsaData" が定義されていません

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
WSAData; wsaData;
SOCKET sock;
struct sockaddr_in addr;

WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(9750);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.8 ");

sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));

closesocket(sock);
WSACleanup();

return 0;
}


教えてください。宜しくお願いします。

以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか?
1 IntelliSense: 識別子 "WSAData" が定義されていません
2 IntelliSense: 識別子 "wsaData" が定義されていません

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
WSAData; wsaData;
SOCKET sock;
struct sockaddr_in addr;

WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(9750);
addr....続きを読む

Aベストアンサー

>WSAData wsaData;

WSADATA wsaData;
ですね。

構造体のタグ名と型名の違いってとこですか。

Qマークシートと読み取り機(?) 他カテ重複勘弁

どこのカテゴリーで相談したらよいのか、わからなくてまずここで質問させてください。

私は高校の教員ですが、50代も半ばになって困ってることがあります。
それは、テストの採点です。
いま、教えている生徒はのべ9クラス、320人ですが、体力と気力が続かず、二晩徹夜したぐらいでは採点が終わらず周囲にたいへん迷惑をかけています。勉強のできない生徒が大半の学校ですので穴埋め問題を記号選択式にしても、百店満点の問題では、問題数が70~80問になりとにかくそれらに赤ペンを入れるのは厳しくなってきました。
すみません、前置きが長すぎました。

質問は自分のテストの解答ををマークシートにして、機械で読み込ませたらどんなに助かるだろうと思っているんです。
センター試験や予備校の全国模試のような処理をしたいということです。

マークシートやその読み取り機はどこで入手したらよいのかわかりません。
周囲には、そういう処理はしたことないから、わからないと皆言います。
どなたか、おわかりの方いましたら、どうか教えてください。
誤解のないように申し上げますが、私はただ単にラクをしたいというのではなく、
マークシートでも良い問題をつくることはできます。

もちろん、教えて下さるのなら、年齢も性別も問ません。
どうかよろしくお願い申し上げます。

どこのカテゴリーで相談したらよいのか、わからなくてまずここで質問させてください。

私は高校の教員ですが、50代も半ばになって困ってることがあります。
それは、テストの採点です。
いま、教えている生徒はのべ9クラス、320人ですが、体力と気力が続かず、二晩徹夜したぐらいでは採点が終わらず周囲にたいへん迷惑をかけています。勉強のできない生徒が大半の学校ですので穴埋め問題を記号選択式にしても、百店満点の問題では、問題数が70~80問になりとにかくそれらに赤ペンを入れるのは厳しくなって...続きを読む

Aベストアンサー

No.6の方はマーク形式、選択軽視の批判をされておられますが、センター試験や医師の国家試験
などもこの形式を採用しています。これが世の流れなので、仕方ないことでしょう。
また、大学の研究機関による検証では、数学以外の科目ではセンター試験はほぼその生徒の
学力を正しくとらえているようです。
要はマグレはそうは続かないということです。
逆に、記述式にするとおどうしても採点にブレや好みが生じて、正しい判定ができなくなる
要素もあります。この要因よりもマグレの要因の方が小さい事が多いのです。
また、解答課程が正しくとも正解の出ない生徒は、それはそれで問題がありますし、
想定した解答手順でなくとも正解の出る生徒は評価をするべきです。

No.4の方の方法にはやや問題があります。
私が高校生だったのは30年くらい前ですが、そのときに倫理社会の先生で、
書かれているような解答形式の問題を出した先生がおられました。
私は問題を解いているときに採点方法を推定し、わからない問題があれば
複数の回答に○を付けておきました。
試験の返却時にはそれらがすべて正解として判定されていました。

また、関西のK大学などのように、マークシートと記述を混ぜて出題する大学があります。
私がK大学を受験したとき、記述の回答欄の横に、6・3・2・0のマーク欄があることを
見つけました。採点者は記述問題を採点して、その得点をマークする欄だと推定しました。
そこで、すべて6点にマークしておいたところ、合格しました。

解答用紙や出題形式を工夫することで、もっと採点が楽になりませんか?
例えば、3択の問題ならば2個組み合わせて9通りにして、(1)~(9)から選ぶように
すると採点の数が減ります。
また、1,2,3の選択肢よりもア、イ、ウの選択肢の方が採点が楽です。
また、同じ大問の問題はできるだけ同じ配点にするのも重要です。
ところで、配点は試験作成前に決めていますか?
私は試験を作るときは一番最初に配点から決めます。
その方が出題のバランスが取れるからです。

80個の出題だとしても、1個1秒前後で採点できるはずです。
1人あたり2分としても、1時間半で1クラスの採点が終わります。
1日の返却が3クラスでも4時間半で採点が終わるはずです。

No.6の方はマーク形式、選択軽視の批判をされておられますが、センター試験や医師の国家試験
などもこの形式を採用しています。これが世の流れなので、仕方ないことでしょう。
また、大学の研究機関による検証では、数学以外の科目ではセンター試験はほぼその生徒の
学力を正しくとらえているようです。
要はマグレはそうは続かないということです。
逆に、記述式にするとおどうしても採点にブレや好みが生じて、正しい判定ができなくなる
要素もあります。この要因よりもマグレの要因の方が小さい事が多いの...続きを読む

QLinux/Unix系C言語のレファレンス

が載っているサイトを教えてください
インターネットを見ながらコーディングができたら便利なので探しています

Aベストアンサー

>LinuxでSTLを使おうとしたらエラーになりました
使えます。
Linux系は普通Cコンパイラにgccが入っていると思いますが。
g++ test.cpp
あるいは
c++ test.cpp
でコンパイルが通るはずです。

t_nojiriさんのhttp://www.shibu.jp/cppreference/index.html
はwindows用というわけではありません。

あとたいていの標準関数はオンラインマニュアルにはいっていませんか?

man bzero

man bcopy
とコマンドをうってみてください。
(日本語ならjmanの場合もあります。)

Linuxのどのディストリビューションをお使いかしりませんが
有名なものは標準ではいっているはずです。

Qマークシートの読み取り

マークシート式の試験などで、
どこまできっちりマークすれば読み取りますか?
以前マークの丸の真ん中だけマークしたところ、
なんとか読み取ってもらえたのですが、
…危険でしょうか?
枠まできっちりマークしてると時間がなくなってしまします;

Aベストアンサー

卵形のマークシートの話でいいでしょうか?

読み取りの方式は2つあります。
細かい仕組みは省きますが、画像として読み取る方法と、光の反射で読み取る方法です。前者はコピーや写真と同じで、一定枠内の色の濃さをみます。後者は、CDなどの読み取りと同じで、光を当て、鉛筆に含まれる黒鉛による反射を読み取るので、点での読み取りになります。

前者の場合、枠内を平均的に塗っていればOK。ある程度薄くても全体に塗っていれば良いことになります。また、ボールペンでも読み取れます。
後者の場合、枠の中央付近を濃く塗っておくと読み取りやすくなります。また、黒鉛筆以外は(黒鉛が無いので)NGです。

いずれの場合でも、枠の部分をきっちりと塗る必要はありません。
また、いずれの方法でも苦手なのは、線を書いて塗ったことにしているパターンです。線一本でも縞々に書いても危ないです。
両者のどちらのタイプを採用しているかは、マークの塗り方の「悪い例」で推測できる場合があります。

受験経験者でたまに勘違いをしている人がいますが、「模試」の場合、マークシートが読めませんでしたとか、生徒の塗り方が悪くて成績が出せませんでした、とは、よほど酷いケースでも言えないので、全く読み取れないというケースは、マークシートを読み取る係の人がマークシートを塗り直します。商売ですからね。
なので、「私の場合、これでも大丈夫でした」というケースの多くは、あんまりだ丈夫じゃないですよ。
中学生相手の模試の場合、2割くらいは現場の人が塗り直しているというケースもありましたし。

一番ダメなのは、細いシャープペンシルを硬い芯で使うこと。
どちらの方式でも、薄い色や面ではなく細い線で塗られると読み取りにくいです。
後者の方式だと、紙に穴が空くのは小さくても論外ですし、堅いシャープペンシルの芯には黒鉛以外の黒色成分が入っていることもあって、濃く塗っているつもりでも実は機械にとっては薄い色という場合も。
マークシート用のシャープペンシルもあるので、検討してみては? 私は仕事では、芯ホルダーを使っています。一応オススメかも。
安い物だと、こういうの。
http://www.sun-star-st.jp/private_brand/sharpits.html
芯が2Bしかないので、UNIのHBを入れています。
http://bundoki.com/?pid=2039249
http://bundoki.com/?pid=3399534

卵形のマークシートの話でいいでしょうか?

読み取りの方式は2つあります。
細かい仕組みは省きますが、画像として読み取る方法と、光の反射で読み取る方法です。前者はコピーや写真と同じで、一定枠内の色の濃さをみます。後者は、CDなどの読み取りと同じで、光を当て、鉛筆に含まれる黒鉛による反射を読み取るので、点での読み取りになります。

前者の場合、枠内を平均的に塗っていればOK。ある程度薄くても全体に塗っていれば良いことになります。また、ボールペンでも読み取れます。
後者の場合...続きを読む

Qお勧めのC/C++言語仕様サイト

を教えてください
できるだけ新しいものがほしいのですが
古いのしかなければそれを教えてください

Aベストアンサー

言語仕様という事なら、C99相当の仕様書が、日本工業標準調査会のサイトから閲覧できます。
ページ「JIS検索」にて、JIS規格番号「X3010」を検索すると見つかります。

参考URL:http://www.jisc.go.jp/

Q馬券購入のマークシートについて

こんにちは。
競馬暦まだ浅い6年目になる私なのですが最近3連複に馬単にマークシートが増えるやらで書き間違いを良くやらかすんです。
前日のマークをし忘れて買い間違いとか、ウインズでは馬名まで出ないため連とかワイドだとあとで「あれ?○番ってなんだっけ?」なんてことがよくあり悔しい思いも多々ありました。
ここで皆様に質問です。
私のやらかした馬券購入時の失敗談やマークシート記入時にこうすれば大丈夫!!とかの裏技、現状のマークシートに対する不満とかありましたら教えていただきたいのですが。
少しマークシートに関して革命的な(笑)発明を考えていますのでそれの参考にもさせていただければと思っております。
宜しくお願いいたします。

Aベストアンサー

マークシートって結構面倒ですよね
私もマークシートでの失敗はショッチュウしますので
ご苦労の程がよく解ります。

私がよくヤル失敗は場名の塗り間違いですね
塗り間違った競馬場がたまたまその日開催されていたら
そのまま購入になってしまうので厄介なんですよね
これで万馬券を逃した事が何度か有ります。

あと馬単、3連復が発売された初日に
幾つかのレースの3連復と馬単をボックスで購入したのですが
何故か予算をオーバーしてしまって、
後の方のレースを見送らなきゃイケない羽目になりました。
その時3連復と馬単のボックスって何頭で何通りになるか
って言うのがまだ頭にちゃんと入ってなくて
計算間違いしてしまっていたんですね(苦笑)
未だに解らなくなる時が有るので
競馬新聞等にそういう表を書いて頂けると有り難いななんて思います。

あと反対に馬の番号を枠の番号と間違えて塗って
万馬券が取れたラッキーな経験も有ります。

今後マークシートに希望する事ですが
●馬単の1着流しと2着流しを1枚で出来る様にして欲しい
 今はどちらか選ばないとイケないですよね

●3連復を1頭だけからでも流せる様にして欲しい
 今は軸を2頭決めないと流せないですよね

まだまだマークシートへの不満は有りますが
長くなりそうなのでこの辺で(笑)

マークシートって結構面倒ですよね
私もマークシートでの失敗はショッチュウしますので
ご苦労の程がよく解ります。

私がよくヤル失敗は場名の塗り間違いですね
塗り間違った競馬場がたまたまその日開催されていたら
そのまま購入になってしまうので厄介なんですよね
これで万馬券を逃した事が何度か有ります。

あと馬単、3連復が発売された初日に
幾つかのレースの3連復と馬単をボックスで購入したのですが
何故か予算をオーバーしてしまって、
後の方のレースを見送らなきゃイケない羽目になり...続きを読む

QC/C++言語で日本語処理

C言語orC++言語で日本語の処理がしたいのですが方法がわかりません。
以下のlen,mid関数を作成したいのですが、どうすればよいのでしょうか。
文字コードはSJIS(CP932?)とします。

また、C言語のソースは基本的にSJIS書き、コンパイルすると解釈してよいですか?WindowsはSJIS? LinuxはEUC-JP??

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

void main(void){
char moji[] = "パソコンでABC";

// この結果は「パソコンでABC」, 19, 18で正しいです。
printf("%s\n%d\n%d", moji, sizeof(moji), strlen(moji));

// 文字数換算で8と出力させる方法
// 汎用関数 Len関数を作る Lenbでない。この場合 len(moji)の結果は「8」

// 文字数換算で6文字目から3文字数カットしたABCを出力する。
// 汎用的に MID関数を作る MIDBでない。この場合 mid(moji, 3, 5)の結果は 「コンでABC」

}

あと、詳しい書籍等もご存知の方教えてください。

C言語orC++言語で日本語の処理がしたいのですが方法がわかりません。
以下のlen,mid関数を作成したいのですが、どうすればよいのでしょうか。
文字コードはSJIS(CP932?)とします。

また、C言語のソースは基本的にSJIS書き、コンパイルすると解釈してよいですか?WindowsはSJIS? LinuxはEUC-JP??

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

void main(void){
char moji[] = "パソコンでABC";

// この結果は「パソコンでABC」, 19, 18で正しいです。
printf("%s\n%d\n%d", moji, sizeof(moji),...続きを読む

Aベストアンサー

参考までにGNU C++の場合を書いてみます。

ソースファイルでCP932を使う場合、コンパイルオプションで-finput-charset=cp932を指定する必要があります。実行文字コードは、ロケールにあわせて-fexec-charsetで指定してください。(デフォルトではUTF-8になります)

内部的な処理は、多バイト文字列のままでは面倒なので、いったんワイド文字列に変更します。mbstowcs等で変換するか、libiconvでも使いましょう。(もちろん、ICUなどの外部ライブラリでもOKですし、std::codecvtファセットを使ってもOK)
ワイド文字列になってしまえば、あとはstd::wstringを使えば簡単です。

VBのLenは、std::wstring::sizeまたはstd::wstring::lengthを使います。
VBのMidは、std::wstring::substrを使うか、std:wstringのコンストラクタで対応できます。

以下、未検証ですが、コードをのせておきます。

#include <iostream>
#include <string>
#include <locale>
#include <clocale>
#include <cstdlib>

int main()
{
 std::setlocale(LC_CTYPE, "");
 std::wcout.imbue(std::locale(""));

 wchar_t wcs[16];
 mbstowcs(wcs, "パソコンでABC", sizeof(wcs)/sizeof(wcs[0]));
 std::wstring moji(wcs);

 std::wcout << L"Len(moji): " << moji.length() << std::endl;
 std::wcout << L"Mid(moji, 3, 5): << moji.substr(3, 5) << std::endl;
}

参考までにGNU C++の場合を書いてみます。

ソースファイルでCP932を使う場合、コンパイルオプションで-finput-charset=cp932を指定する必要があります。実行文字コードは、ロケールにあわせて-fexec-charsetで指定してください。(デフォルトではUTF-8になります)

内部的な処理は、多バイト文字列のままでは面倒なので、いったんワイド文字列に変更します。mbstowcs等で変換するか、libiconvでも使いましょう。(もちろん、ICUなどの外部ライブラリでもOKですし、std::codecvtファセットを使ってもOK)
ワ...続きを読む


人気Q&Aランキング

おすすめ情報