1

バッファ(char *)を読み取っていて、カーソルがあり、バッファの開始位置を追跡しています。バッファから7〜64文字をコピーする方法がありますか、ループするのが最善の策です。位置xから位置yへのバッファ?

宛先バッファーのサイズは、動的に計算された別の関数の結果です

これを初期化すると

variable-sized object 'version' may not be initialized

関連するコード部分:

int32_t size = this->getObjectSizeForMarker(cursor, length, buffer);
cursor = cursor + 8; //advance cursor past marker and size
char version[size] = this->getObjectForSizeAndCursor(size, cursor, buffer);

-

char* FileReader::getObjectForSizeAndCursor(int32_t size, int cursor, char *buffer) {
  char destination[size];
  memcpy(destination, buffer + cursor, size);
}

-

int32_t FileReader::getObjectSizeForMarker(int cursor, int eof, char * buffer) {
  //skip the marker and read next 4 byes
  cursor = cursor + 4; //skip marker and read 4
  unsigned char *ptr = (unsigned char *)buffer + cursor;
  int32_t objSize = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
  return objSize;

}
4

1 に答える 1

1

ポインタをbuffer6単位先に移動し(7番目のインデックスに到達するため)、次にmemcpy64〜7(57)バイトに移動します。例:

const char *buffer = "foo bar baz...";
char destination[SOME_MAX_LENGTH];
memcpy(destination, buffer + 6, 64-7);

destination標準のC文字列関数を使用して配列を操作できるように、配列を終了することをお勧めします。コピーされた57バイトの後に、 58番目のインデックスにヌル文字を追加していることに注意してください。

/* terminate the destination string at the 58th byte, if desired */
destination[64-7] = '\0'; 

動的なサイズで作業する必要がある場合destinationは、配列の代わりにポインターを使用してください。

const char *buffer = "foo bar baz...";
char *destination = NULL;

/* note we do not multiply by sizeof(char), which is unnecessary */
/* we should cast the result, if we're in C++ */
destination = (char *) malloc(58); 

/* error checking */
if (!destination) { 
    fprintf(stderr, "ERROR: Could not allocate space for destination\n");
    return EXIT_FAILURE;
}

/* copy bytes and terminate */
memcpy(destination, buffer + 6, 57);
*(destination + 57) = '\0';
...

/* don't forget to free malloc'ed variables at the end of your program, to prevent memory leaks */
free(destination); 

正直なところ、C ++を使用している場合は、おそらくC++文字列ライブラリstd::stringクラスを使用しているはずです。次にsubstr、インスタンスでsubstringメソッドを呼び出して、対象stringの57文字のサブストリングを取得できます。頭痛の種が減り、車輪の再発明が減ります。

ただし、上記のコードは、CアプリケーションとC++アプリケーションの両方に役立つはずです。

于 2012-10-07T02:59:48.153 に答える