アプリ版:「スタンプのみでお礼する」機能のリリースについて

AnsiString memo3;

というところに文字列"0X0X0X0X"というのが入っています。

この8文字を1文字つづ読み取り、文字コードによって分岐するコードを作成して1バイトの数値データを作りたいと考えています。





その際に


  String area_chk = memo3.SubString(j+1,1);
strcpy((char *)code,(char *)area_chk.c_str());


memo3の1文字をSubString(j+1,1)で取ってバイトデータをcodeに入れました。

その時に

BYTE code;


で宣言していると、ビルドは通るのですが、デバッグで
strcpy((char *)code,(char *)area_chk.c_str()); この分を通過する際にエラーがでて
止まってしまいます。


現在

BYTE code[2];

これを宣言しておくと問題はないのですが、いちいち2バイト宣言しないと
いけないのでしょうか?

解決法などご教授いただきますよう、お願い致します。




現在下のコードのようにして動作させています。

for(int j=0;j<8;j++) {
if(i == 0)
{
break;
}
code[0] = 0x00;
code[1] = 0x00;
String area_chk = memo3.SubString(j+1,1);
strcpy((char *)code,(char *)area_chk.c_str());
//result_num = result_num < 1;
switch(code[0]) {
case 0x58: //X
result_num = (result_num & 0x7f);
break;
case 0x4f: //0

result_num = result_num + 0x80;

break;
  default:
break;

}
if(j != 7)
{

result_num = result_num >> 1;
}
}
}



どうぞ、よろしくお願い致します。

A 回答 (8件)

No.6の「この回答へのお礼」欄の質問について回答します。



int code = memo1[j];
switch (code) {
case 'す':

case 'し':

}

このコードが分岐しない理由は、値が一致しないためです。

AnsiString::operator[]()はchar型の値を返します。
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …

char型の変数の長さは1バイトで、-128~127の値をとります。
http://docwiki.embarcadero.com/RADStudio/XE4/ja/ …

日本語版WindowsではAnsiStringの文字コードはShift_JISになります。
Shift_JISのひらがなはマルチバイト文字ですから、memo1[1]には「す」の1バイト目、memo1[2]には「す」の2バイト目の値が入ります。

それぞれの値を出力して確認すればよくわかると思います。
    • good
    • 0

> 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'等の表現方法があるのに、なぜ使わないのか、ということです。


プログラミングって、基礎あっての応用だと思います。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。

文字コードを表わす'X'

このようなやり方ができるのはとても便利ですね。

お礼日時:2013/08/07 19:47

char AnsiString.operator[](const int idx)


を使えば、一文字ずつ取得することができます。

* System.AnsiStringBase.operator [] - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …


AnsiString memo3 = "0X0X0X0X";

for (int j = 1; j <= memo3.Length(); j++)
{
BYTE code = memo3[j];
switch (code) {
case 'X':

case '0':

}
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。


case 'X':


このような書き方ができるのですね。すごく助かりました。


それで、AnsiString memo1 = "する";

このような文字でも

int code = memo1[j];
switch (code) {
case 'す':

case 'し':

}


このようなやり方はできるのでしょうか?




実際これでやってみたところ、switch文ではどのcaseにも分岐してくれませんでした。


そこで

case 0x3059:

としたら、分岐できたのですが、このような書き方はできないのでしょうか?

追加質問で申し訳ありません。

お礼日時:2013/08/07 19:47

あえて突っ込むけど, なんで


case 0x4f: //O
なんてコメント書くの?
    • good
    • 0

本題は終わってるけど


case 0x4f: //0
は混乱する人が出てくるだろうなぁ....

なんでコメントなんて書くんだろう.
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。


case 0x4f: //0

確かにそうですね(^^;

"0"ではなく"O"ですね。

お礼日時:2013/08/05 18:54

追記。


charとして受け取りたいだけなら、SubStringする必要も無い。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。


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文字の
文字の文字コードにアクセスする方法があると言うことでしょうか?

お礼日時:2013/08/05 18:53

strcpyはその名のとおり文字列のコピー。

受ける側も文字列でないとアカンでしょう。

でか、なんでわざわざ strcpy すんですか?

BYTE code = area_chk[0]; とか
BYTE code = *area_chk.c_str(); とかやればよくね?
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。


BYTE code = *area_chk.c_str();


このやり方は便利ですね。

お礼日時:2013/08/05 18:50

Cの文字列の基本。


必要な領域は、文字数+1('\0'用)


BYTE code;
strcpy((char *)code,(char *)area_chk.c_str()); 
だと、そもそもおかしい。
codeは8ビットの整数で、それを(char *)にキャストしている。「変数codeのアドレス」では無いことに注意。


単に、先頭の1文字を使うだけなら、strcpy使う必要すらない。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。


String area_chk = memo3.SubString(j+1,1);
BYTE code = *area_chk.c_str();

switch(code) {

・・・・


このようなやり方でもswitch文が作れるのですね。

助かります。

お礼日時:2013/08/05 18:49

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