• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SubStringの使い方について)

SubStringの使い方について

このQ&Aのポイント
  • AnsiString memo3に文字列"0X0X0X0X"が入っています。この8文字を1文字つづ読み取り、文字コードによって分岐するコードを作成して1バイトの数値データを作りたいと考えています。
  • memo3の1文字をSubString(j+1,1)で取ってバイトデータをcodeに入れました。その時にBYTE code;で宣言していると、ビルドは通るのですが、デバッグでstrcpy((char *)code,(char *)area_chk.c_str());この分を通過する際にエラーがでて止まってしまいます。
  • 現在BYTE code[2];これを宣言しておくと問題はないのですが、いちいち2バイト宣言しないといけないのでしょうか?

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

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

No.6の「この回答へのお礼」欄の質問について回答します。 int code = memo1[j]; switch (code) { case 'す': … case 'し': … } このコードが分岐しない理由は、値が一致しないためです。 AnsiString::operator[]()はchar型の値を返します。 http://docwiki.embarcadero.com/Libraries/XE4/ja/System.AnsiStringBase.operator_H5BH5D char型の変数の長さは1バイトで、-128~127の値をとります。 http://docwiki.embarcadero.com/RADStudio/XE4/ja/Char 日本語版WindowsではAnsiStringの文字コードはShift_JISになります。 Shift_JISのひらがなはマルチバイト文字ですから、memo1[1]には「す」の1バイト目、memo1[2]には「す」の2バイト目の値が入ります。 それぞれの値を出力して確認すればよくわかると思います。

すると、全ての回答が全文表示されます。

その他の回答 (7)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.7

> BYTE code = *area_chk.c_str(); String:c_str()と、C言語の文字列の基本、配列とポインタの関係が理解できていれば。 「C言語での文字列(=charの配列)のn文字目」はどうすればいいか、すぐわかるはずです。 それがわかれば、わざわざSubStringで分割することなく、任意の一文字のコードを読めることがわかるはずです。 また、Stringのマニュアルをよく読めば、#6にあるように、[]演算子が定義されていて、指定の文字を取り出すことができることが、わかったはずです。 指摘のあった「コメント」について。 例えば、[G]を追加したとします。 switch(code) { case 0x58: //X  result_num = (result_num & 0x7f);  break; case 0x4f: //O  result_num = result_num + 0x80;  break; case 0x48: //G  result_num = (result_num & 0x3f);  break; default:  break; } これ、間違い(C言語としては正しいプログラムだけど、仕様通りに動かない)だってわかりますか? 私には、短時間で発見できる自信はありません。 文字コードを表わす'X'等の表現方法があるのに、なぜ使わないのか、ということです。 プログラミングって、基礎あっての応用だと思います。

diy_sunny
質問者

お礼

回答頂きありがとうございます。 文字コードを表わす'X' このようなやり方ができるのはとても便利ですね。

すると、全ての回答が全文表示されます。
回答No.6

char AnsiString.operator[](const int idx) を使えば、一文字ずつ取得することができます。 * System.AnsiStringBase.operator [] - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.AnsiStringBase.operator_H5BH5D AnsiString memo3 = "0X0X0X0X"; for (int j = 1; j <= memo3.Length(); j++) { BYTE code = memo3[j]; switch (code) { case 'X': … case '0': … }

diy_sunny
質問者

お礼

回答頂きありがとうございます。 case 'X': このような書き方ができるのですね。すごく助かりました。 それで、AnsiString memo1 = "する"; このような文字でも int code = memo1[j]; switch (code) { case 'す': … case 'し': … } このようなやり方はできるのでしょうか? 実際これでやってみたところ、switch文ではどのcaseにも分岐してくれませんでした。 そこで case 0x3059: としたら、分岐できたのですが、このような書き方はできないのでしょうか? 追加質問で申し訳ありません。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

あえて突っ込むけど, なんで case 0x4f: //O なんてコメント書くの?

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

本題は終わってるけど case 0x4f: //0 は混乱する人が出てくるだろうなぁ.... なんでコメントなんて書くんだろう.

diy_sunny
質問者

お礼

回答頂きありがとうございます。 case 0x4f: //0 確かにそうですね(^^; "0"ではなく"O"ですね。

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

追記。 charとして受け取りたいだけなら、SubStringする必要も無い。

diy_sunny
質問者

お礼

回答頂きありがとうございます。 String area_chk = memo3.SubString(j+1,1); BYTE code = *area_chk.c_str(); switch(code) { ・・・・ この”String area_chk = memo3.SubString(j+1,1);” ということもやらなくても、”XOXOXOXO”という8文字の 文字の文字コードにアクセスする方法があると言うことでしょうか?

すると、全ての回答が全文表示されます。
回答No.2

strcpyはその名のとおり文字列のコピー。受ける側も文字列でないとアカンでしょう。 でか、なんでわざわざ strcpy すんですか? BYTE code = area_chk[0]; とか BYTE code = *area_chk.c_str(); とかやればよくね?

diy_sunny
質問者

お礼

回答頂きありがとうございます。 BYTE code = *area_chk.c_str(); このやり方は便利ですね。

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

Cの文字列の基本。 必要な領域は、文字数+1('\0'用) BYTE code; strcpy((char *)code,(char *)area_chk.c_str());  だと、そもそもおかしい。 codeは8ビットの整数で、それを(char *)にキャストしている。「変数codeのアドレス」では無いことに注意。 単に、先頭の1文字を使うだけなら、strcpy使う必要すらない。

diy_sunny
質問者

お礼

回答頂きありがとうございます。 String area_chk = memo3.SubString(j+1,1); BYTE code = *area_chk.c_str(); switch(code) { ・・・・ このようなやり方でもswitch文が作れるのですね。 助かります。

すると、全ての回答が全文表示されます。

関連するQ&A