2

これがシナリオです。

// I have created a buffer
void *buffer = operator new(100)

/* later some data from a different buffer is put into the buffer at this pointer
by a function in an external header so I don't know what it's putting in there */

cout << buffer;

このポインタでバッファに入れられたデータを印刷して、何が入ったかを確認したい。生のASCIIとして印刷したいのですが、印刷できない文字がいくつかあることはわかっていますが、いくつかの読みやすいテキストがそこにプッシュされました。

私がインターネットで読んだものから、またはではなく、coutのようなキャストされていないデータを印刷することはできません。ただし、コンパイラは、たとえばを使用してその場でキャストすることを許可しません。ポインタに値をキャストしてからその変数をキャストする別の変数を作成する必要がありますか、それとも別の変数に保存するためにこれを直接行う方法はありますか?voidintchar(char)cout

4

4 に答える 4

6

次のようなことをします:

// C++11
std::array<char,100> buf;
// use std::vector<char> for a large or dynamic buffer size

// buf.data() will return a raw pointer suitable for functions
//   expecting a void* or char*
// buf.size() returns the size of the buffer

for (char c : buf)
    std::cout << (isprint(c) ? c : '.');

// C++98
std::vector<char> buf(100);

// The expression `buf.empty() ? NULL : &buf[0]`
//   evaluates to a pointer suitable for functions expecting void* or char*

// The following struct needs to have external linkage
struct print_transform {
    char operator() (char c) { return isprint(c) ? c : '.'; }
};

std::transform(buf.begin(), buf.end(),
               std::ostream_iterator<char>(std::cout, ""),
               print_transform());
于 2012-05-10T16:38:55.337 に答える
1

これを行う:

char* buffer = new char[100];

std::cout << buffer; 
// at some point
delete[] buffer;

void*主にCインターフェイスとの相互運用のために、特定の状況でのみ必要ですが、これはvoid*、本質的にすべての型情報を失う、を必要とする状況ではありません。

于 2012-05-10T16:33:08.787 に答える
1

にキャストする必要がありますchar*reinterpret_cast<char*>(buffer)。問題はそれvoid*が何かを表すことなので、ポインタだけが出力されます。にキャストするとchar*、メモリの内容はCスタイルの文字列として解釈されます

注:reinterpret_cast<>Cスタイルの代わりに使用(char *)して、意図を明確にし、後で見つけにくい微妙で見つけにくいバグを回避します

注:もちろん、代わりにセグメンテーション違反が発生する可能性があります。データが実際にCスタイルの文字列ではないかのように、バッファに関連付けられていないメモリにアクセスする可能性があります。

更新:最初にメモリをchar*バッファに割り当てることができ、それでも問題は解決します:サードパーティ関数を呼び出すこともできます(char*暗黙的にに変換可能void*であり、サードパーティ関数のパラメータタイプであると推測されます)。キャストを行う必要はありません。最善の策は、メモリをゼロにして、サードパーティ関数が99 *sizeof(char)バイトを超えるバイトをバッファにコピーするように制限して、終了する'\0'Cスタイルの文字列ターミネータを保持することです。

于 2012-05-10T16:34:36.400 に答える
1

バイトごとに移動したい場合は、unsignedcharを使用してそれを繰り返すことができます。

unsigned char* currByte = new unsigned char[100];
for(int i = 0; i < 100; ++i)
{
    printf("| %02X |", currByte[i]);
}

これは非常に現代的な(または非常に「C ++」)答えではありませんが、16進値として出力されます。

于 2012-05-10T16:39:34.780 に答える