4

これは、私がこれまで得意ではなかったC /C++の1つの領域です。

私の問題は、最終的にいくつかのヌル文字を含める必要がある文字列があることです。すべてをchar配列(または文字列)として扱うことは機能しません。最初のnullを見つけると物事が崩れる傾向があるためです。だから私は、わかりました、uint8_tに切り替えると思ったので、すべてが単なる数字です。必要に応じて物を動かし、準備ができたらcharにキャストして戻すことができます。

今の私の主な質問は、文字列の一部をuint8_tバッファにコピーするにはどうすればよいですか?

効果的に、私は次のようなことをしたいと思います:

std::string s = "abcdefghi";
uint8_t *val = (uint8_t*)malloc(s.length() + 1);
memset(val, 0, s.length() + 1);

// Assume offset is just some number
memcpy(val + offset, s.substr(1, 5).c_str(), 5);

明らかに、これを試してみるとエラーが発生します。memcpyの最初の引数で実行できるある種のトリックがおそらくあります(オンラインで(*(uint8_t *))のようなものが表示され、それが何を意味するのかわかりません)。

何をすべきかについて何か助けはありますか?

そして、私がここにいる間、どうすればこれをchar配列に簡単にキャストバックできますか?uint8_tポインタをcharポインタにstatic_castするだけですか?

どうもありがとう。

4

2 に答える 2

1

私は、わかりました、uint8_tに切り替えると思ったので、すべてが単なる数字です。

これにより、「\ 0」を検索するアルゴリズムが突然停止することはなく、charを使用するアルゴリズムが \0」に注意を払う必要もありません。ヌル文字で終了を通知するのは、char配列ではなく、C文字列の規則です。uint8_tは、とにかくcharのtypedefである可能性があります。

Nicol Bolasが指摘しているように、std :: stringは、null文字を特別に処理することなく、null文字を含む文字列を格納することができます。

あなたの質問に関しては、以下がうまく機能するので、あなたがどのエラーを参照しているのかわかりません:

#include <iostream>
#include <string>
#include <cstdint>
#include <cstring>

int main() {
    std::string s = "abcdefghi";
    std::uint8_t *val = (std::uint8_t*)std::malloc(s.length() + 1);
    std::memset(val, 0, s.length() + 1);

    int offset = 2;
    std::memcpy(val + offset, s.substr(1, 5).c_str(), 5);
    std::cout << (val+offset) << '\n';
}

memcpy行は、文字列から2番目から6番目の文字sを取得し、それらをvalにコピーします。coutのある行は、「bcdef」を出力します。

もちろんこれはC++なので、手動でメモリを割り当ててゼロにしたい場合は、次のように行うことができます。

std::unique_ptr<uint8_t[]> val(new uint8_t[s.length()+1]());

またはベクトルを使用します:

std::vector<uint8_t> val(s.length()+1,0);

uint8_tの配列からキャストするには、次のことを実行できます(ただし、通常は実行しないでください)。

char *c = reinterpret_cast<uint8_t*>(val);
于 2012-05-31T20:18:09.773 に答える
0

さて、コードは問題なく動作し、valの部分文字列をコピーします。ただし、オフセットまでのすべての位置に0があります。

たとえば、offset = 2の場合、valは{0、0、b、c、d、e、f、0、0、0}になります。

これを印刷すると、文字列が最初の位置でnullで終了しているため、何も表示されません(これは、あなたが話していたエラーだと思います...)。

于 2012-05-31T19:59:30.817 に答える