![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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;
}
}
}
どうぞ、よろしくお願い致します。
No.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バイト目の値が入ります。
それぞれの値を出力して確認すればよくわかると思います。
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'等の表現方法があるのに、なぜ使わないのか、ということです。
プログラミングって、基礎あっての応用だと思います。
No.6
- 回答日時:
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':
…
}
回答頂きありがとうございます。
case 'X':
このような書き方ができるのですね。すごく助かりました。
それで、AnsiString memo1 = "する";
このような文字でも
int code = memo1[j];
switch (code) {
case 'す':
…
case 'し':
…
}
このようなやり方はできるのでしょうか?
実際これでやってみたところ、switch文ではどのcaseにも分岐してくれませんでした。
そこで
case 0x3059:
としたら、分岐できたのですが、このような書き方はできないのでしょうか?
追加質問で申し訳ありません。
No.3
- 回答日時:
追記。
charとして受け取りたいだけなら、SubStringする必要も無い。
回答頂きありがとうございます。
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.1
- 回答日時:
Cの文字列の基本。
必要な領域は、文字数+1('\0'用)
BYTE code;
strcpy((char *)code,(char *)area_chk.c_str());
だと、そもそもおかしい。
codeは8ビットの整数で、それを(char *)にキャストしている。「変数codeのアドレス」では無いことに注意。
単に、先頭の1文字を使うだけなら、strcpy使う必要すらない。
回答頂きありがとうございます。
String area_chk = memo3.SubString(j+1,1);
BYTE code = *area_chk.c_str();
switch(code) {
・・・・
このようなやり方でもswitch文が作れるのですね。
助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語にて構造体のメンバがNULL...
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
new charとnew char[N]の違いは?
-
可変長構造体をファイルから読...
-
2次元配列の文字"列"の初期化方法
-
36進数
-
C言語の文字リテラル中の16進文...
-
SubStringの使い方について
-
char[]をDWORDに格納するには
-
動的メモリの初期化方法について。
-
char 文字列型 の表現範囲が-12...
-
C言語のintとcharの違いってな...
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
char型にint型の数値を代入する。
-
C++17で、unsigned char * 配列...
-
文字列の反転
-
C# ポインタ アクセス違反
-
警告 : 問題のあるポインタの変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
strcat関数を自作したいです
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
char型にint型の数値を代入する。
-
文字列の途中から途中までを抽出
-
new charとnew char[N]の違いは?
-
文字列内の数字削除
-
csvファイルをfscanfで読み込む...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
エクセルのMID関数は、C言語では?
-
ポインタを使って回文かどうか...
-
ポインタ配列
おすすめ情報