web-dev-qa-db-ja.com

char配列の一部を取得する

これは本当にばかげた質問だと思いますが、どこにも答えが見つからないようです!

文字配列から文字のグループを取得することは可能ですか?いくつかの擬似コードをスローする:

char arry[20] = "hello world!";
char part[10] = arry[0-4];
printf(part);

出力:

hello

それで、ループして文字ごとに取得したり文字列に変換したりせずに、このような配列から文字のセグメントを取得して、substr()を使用できますか?

12
Curlystraw

つまり、いいえ。 Cスタイルの「文字列」は、そのようには機能しません。手動ループを使用するか、strncpy()を使用するか、C++の_std::string_機能を使用する必要があります。 C++を使用している場合、C++文字列ですべてを実行することもできます。

サイドノート

たまたま、特定のサンプルアプリケーションでは、printf()が提供する機能を使用するだけでこれを実現できます。

_printf("%.5s\n", arry);
_
15

memcpy(またはstrncpy)を使用して部分文字列を取得できます。

_memcpy(part, arry + 5 /* Offset */, 3 /* Length */);
part[3] = 0; /* Add terminator */
_

コードの別の側面では、strに信頼できない入力が含まれている場合、printf(str)を実行するとフォーマット文字列の脆弱性が発生する可能性があることに注意してください。

15

Oliが言ったように、C++ std::string機能を使用する必要があります。あなたの例では:

std::string hello("Hello World!");
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4'

std::cout << part;
5
Moo-Juice

まあ、あなたは2つの明白なアプローチに言及します。私が考えることができる唯一のことは、文字配列を処理するために独自の部分文字列型を定義することです:

struct SubArray
{
    SubArray(const char* a, unsigned s, unsigned e)
        :arrayOwnedElseWhere_(a),
        start_(s),
        end_(e)
    {}
    const char* arrayOwnedElseWhere_; 
    unsigned start_;
    unsigned end_;
    void print()
    {
        printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_);
    }
};
0
Keith