4

重複の可能性:
C プログラミング言語の配列のサイズ?

次の形式のコードがあります。

void arrLen(char* array){
    // print length
}

int main(){
    char bytes[16];
    arrLen(bytes);
}

私がする必要があるのは、基になる配列の長さを取得して出力することです。問題は、配列に NULL CHARACTERS が含まれる可能性があるため、strlen機能しないことです。char[]これを行う方法はありますか、または aではなく aとして渡す必要がありchar*ますか?

4

6 に答える 6

6

Cスタイルの配列には、長さの情報は含まれていません。

利用可能ないくつかのソリューションがあります:

配列のサイズを関数に渡します:

void arrLen(char* array, std::size_t size)

C ++ 11(またはコメントで言及されているTR1)にアクセスできる場合は、std::arrayを使用してください

 std::array<char, 16> bytes;

std :: arrayにアクセスできない場合は、boost::arrayを使用できます。それらは標準のものとほぼ同等です。

コメントについて

char*ではなくchar[]として渡す必要がありますか?

配列は常にポインタとして関数に渡されるためvoid arrLen(char* array)、とvoid arrLen(char[] array)は同等です。

于 2013-01-04T14:47:05.783 に答える
3

または、char* の代わりに char[] として渡す必要がありますか?

の宣言を の代わりにarrLen()型のパラメーターを取るように変更しても、このシナリオでは同等であるため、効果はありません。char[]char*

可能な解決策は、template関数を使用することです。

#include <iostream>

template <typename T, int N>
void array_size(T (&a)[N])
{
    std::cout << N << "\n";
}
int main()
{
    array_size("hello");
    char bytes[16];
    array_size(bytes);
    return 0;
}

デモについては、 http://ideone.com/l7GxDpを参照してください。

配列を使用する代わりの方法:

于 2013-01-04T14:46:36.040 に答える
2

従来の方法 (C) では、サイズを関数の属性として渡す必要があります。

void arrLen(char* array, int maxSize){
    // print length
}

int main(){
    char bytes[16];
    arrLen(bytes, 16);
}
于 2013-01-04T14:44:34.097 に答える
1

C ++ 11を使用している場合は、std :: arrayを使用することをお勧めします。これにより、サイズが追跡されます。

于 2013-01-04T14:47:53.783 に答える
1

残念ながら、char[]パラメータchar*タイプは同等です。

2つのオプションがあります。

Cの場合と同じように、長さをポインタと一緒に渡します。

void arrLen(char* array, size_t length)

またはテンプレートを使用します。

template<size_t sz>
void arrLen(char (&array)[sz])
于 2013-01-04T14:48:15.957 に答える
1

C/C++ の配列はそのように処理されません。自分で長さを手動で追跡する必要があります。関数を次のように変更し、関数をvoid arrLen(char * array, int size)呼び出すたびにサイズを指定します。

于 2013-01-04T14:45:51.550 に答える