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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語にて構造体のメンバがNULL...
-
char*を初期化したいのですが
-
コマンドライン引数 *argv[]は...
-
C言語のintとcharの違いってな...
-
char 文字列型 の表現範囲が-12...
-
CStringからchar*への型変換に...
-
小数点入りの文字列をfloat型に...
-
エクセルのMID関数は、C言語では?
-
ポインタを使用 [数字列を数値...
-
C言語:小文字を大文字に変換す...
-
文字列のswap
-
WritePrivateProfileString
-
csvファイルをfscanfで読み込む...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
char AA[]{"全角文字"};から"全...
-
fstream型オブジェクトを関数の...
-
文字列str内の全ての数字を...
-
const char* s1とただのchar s1...
-
C言語で文字列をかえす正しい書...
-
動的メモリの初期化方法について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報