14

静的な char 配列を宣言してから、それを関数に渡します。番号を取得する方法。関数内の配列内のバイト数?

4

7 に答える 7

36

代わりに、非型のテンプレート パラメーターを持つ関数テンプレートを使用します。

template <size_t N>
void func(char (&a)[N]) {
    for (int i = 0; i < N; ++i) {
        cout << "a[" << i << "] = " << a[i] << endl;   // Or whatever you want to do
    }
}

呼び出すには:

char myArray[500];        // Or "static char myArray[500]", if you want
func(myArray);

この関数の新しいコピーは、呼び出される配列の異なるサイズごとにインスタンス化されるため、多数の異なるサイズの配列で呼び出すと、コードが肥大化します。しかし、そうではない可能性が高いです。

于 2009-01-17T10:56:32.890 に答える
14

関数に渡す必要があります。sizeof() を使用して、配列のサイズを取得できます。

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

このMSDN ページには、sizeof の詳細が説明されており、より大きな例があります。

編集: *テンプレートを使用した興味深い手法については、j_random_hacker の回答を参照してください... *

于 2009-01-17T10:29:48.153 に答える
1

いいえ、配列を使用しないでください。代わりにベクトルを使用してください。最近では、配列は安全ではないため、配列を使用する言い訳はほとんどありません。私の知る限り、これらはソフトウェアの問題の主な理由の 1 つです。なぜなら、アレイの最後を誤ってオーバーランしてしまうのは非常に簡単だからです。

ベクターを使用すると、バッファ オーバーランを心配する必要がなくなります。そして、関数はベクトルのサイズを簡単に見つけることができます。

#include <vector>
vector<char> myVector;

void DoSomething(vector<char> &v)
{
    int sizeOfVector = v.size();
}
于 2009-01-17T10:58:06.240 に答える
1

int array_size = sizeof(Array) / sizeof(Array[0]);

于 2009-11-20T13:40:46.243 に答える
1

できません。C++ の配列はポインターであり、配列の先頭へのポインターです。たまたま文字列の場合は、strlen を使用してその長さを測定できます。他の既知の形式の場合は、その形式に従って長さを計算できます。

次のコードを検討してください。

static char str[] = "hello world";

foo(str);
bar(str);

void foo(char* str)
{
   // length of str is unknown
}

void bar(char str[])
{
  // length of str is still unknown
}

関数パラメーターが char[] か char* かに関係なく、サイズはわかりません。

サイズを別のパラメーターとして渡すことをお勧めします。

于 2009-01-17T10:32:19.053 に答える
0

もう 1 つのオプションは、文字列を管理する文字列クラスを作成することです。誰かがすでにこれを行っていると確信しています。最も原始的なバージョンは、char * とバッファー長を持つ構造体で、サイズが変更されるたびに手動でサイズを管理する必要があります。スペクトルのもう一方の端は、演算子のオーバーロードと操作関数を備えた、完全に実装された文字列クラスです。

次に、このクラスを関数に渡すと、すでにサイズがわかっています。別のパラメーターとして渡す場合と実際には違いはありません。文字列の長さがすべて異なる場合、文字列を管理する簡単な方法です。

于 2009-01-17T10:38:46.483 に答える