0

cを使用して、3つの整数(バイトサイズは4)をバイトごとに文字列に配置しようとしています。次に、整数演算を実行できるように、文字配列から整数を「抽出」する必要があります。私は周りを見回しましたが、これに対する解決策を見つけることができませんでした。これにはある種のポインターの使用またはシフトが必要になると思いますが、その書き方がわかりません。

char str[12]="";

int a;
int b;
int c;

int x;
int y;
int z;


a=5;
b=7;
c=12;

int が 4 バイトであることはわかっています。str char配列に次のデータが含まれるようにしたいと思います。

str = |a1|a2|a3|a4|b1|b2|b3|b4|c1|c2|c3|c4|

※こんなことはしたくないです。str=|'5'|'7'|'12'|

次に、文字配列から整数を「抽出」する必要があります。

x=str[0-3];  //extracting a
y=str[4-7];  //extracting b
z=str[8-11]; //extracting c

この後、x=y+z と書けるようになり、x は 19 になります。

4

4 に答える 4

4

1 つの方法は、代わりに配列strとして扱うことです。int

int* istr = reinterpret_cast<int*>(str)

次に、たとえば使用できます

istr[0] = a;
istr[1] = b;
istr[2] = c;

x = istr[0];
y = istr[1];
z = istr[2];
于 2013-10-03T07:56:32.077 に答える
1

質問が適切に提示されていないため、問題を解決する場合としない場合があるさまざまな回答が得られます。私の解釈では、必要なものは次のとおりです。

int i1, i2, i3;
char arr[sizeof(i1)+sizeof(i2)+sizeof(i3)];

memcpy(arr, &i1, sizeof(i1));
memcpy(arr+sizeof(i1), &i2, sizeof(i2));
memcpy(arr+sizeof(i1)+sizeof(i2), &i3, sizeof(i3));

「4」だけでなく、sizeof(i) を使用して意図的に明示していることに注意してください。使用している環境に関係なく、整数が 32 ビットであることはかなり安全ですが、これはより安全であり、厳密に言えばより正確です。

于 2013-10-03T09:03:29.237 に答える
1

最も簡単な解決策は、次を使用することmemcpyです。

int nums[sizeof str / sizeof(int)];
std::memcpy(nums, str, sizeof nums);

// Do work on nums here...

reinterpret_castアプローチは未定義の動作です。

于 2013-10-03T08:40:06.667 に答える
0

(void *)x へのポインターをバイトごとに取得するために使用します。

for (int i = 0; i < sizeof(int); ++i) {
  str[i] = (void *)(&x)[i];
}

これにより、x の 4 バイトが 1 つずつ str にコピーされます。(void )(&x) は x を char配列 (または void*、同じこと) としてキャストし、[i] は配列の i_th バイトにアクセスします。

次に、同じ方法で str の要素にアクセスします。y と z についても同じことを行い、オフセットを忘れないでください。

于 2013-10-03T07:57:06.487 に答える