2011-11-08 1 views
5

どのように私はCの "char *"配列の長さを見つけるのですか?

次の配列を宣言します。

char* array [2] = { "One", "Two"}; 

この配列を関数に渡します。この配列の長さを関数でどのように見つけることができますか?

+1

char型のスターところで==文字ポインタ –

+2

探しsizeメソッドを持っているを使用します「i」はおそらく「これは合理的な質問です」ヒューリスティックではないでしょう。 – sarnold

答えて

17

余分な努力なしに関数に渡した後、配列の長さを見つけることができません。あなたはする必要があります

  1. を推奨)などvectorとして、サイズを格納した容器を使用してください。
  2. それに沿ってサイズを渡します。これは、おそらく、あなたの既存のコードを最小限に修正する必要があり、最も速い修正です。
  3. Cの文字列のように、センチネル値を使用します。これにより、配列の長さを線形時間演算にすることができます。また、センチネル値を忘れると、プログラムがクラッシュする可能性があります。ほとんどの状況でこれを実行する最悪の方法です。
  4. テンプレートを使用して、渡す際に配列のサイズを差し引きます。あなたはここでそれについて読むことができます:あなたは不思議に思った場合にはHow does this Array Size Template Work?

、ほとんどの人は、Cの文字列はこのように動作していることを後悔します。

+0

こうして彼らはB弦を発明した。 –

+0

@MooingDuckリンクGoogleが対象のお母さんです:)してください –

+0

Apperently正しい名前がある[BSTR](http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(V = VS.85 ).aspx)(人々はCの文字列以上のものを憎む) –

6

配列を渡すときに、関数内のサイズを簡単に決定する方法はNOTです。あなたは、特に冒険を感じている場合

あなたはどちらか がパラメータ または 使用 のstd ::ベクトルとして配列のサイズを渡すことができ

<のstd :: string>は

を使用できsome advanced template techniques

一言で言えば、それは何かのように見える

template <typename T, size_t N> 
void YourFunction(T (&array)[N]) 
{ 
    size_t myarraysize = N; 
} 
+0

はい私は現在何をしていますが、私はその余分なパラメータを削除したいと思います。ああよく – bubbles

+0

また、std :: array クラスがあります。 –

+3

@bubbles 'int main(argc、char ** argv)'です。それが簡単だったならば、メインは異なって行われるだろう。 –

0

Ifすべての文字列がどれくらい長くtogatherに追加されたかを意味します。

int n=2; 
int size=0; 
char* array [n] = { "One", "Two"}; 

for (int i=0;i<n;++i) 
    size += strlen(array[i]; 

追加されました:

yesが現在行って何イムthatsのが、私はその余分 のparamaterを削除したかったです。ああ、 -

おそらく、これに対して悪い応答を得ようとしますが、あなたがそれを尊重したり、実際にポインタであると誤解している限り、常に最初のポインタを使用してサイズを格納することができます。

char* array [] = { (char*)2,"One", "Two"}; 

long size=(long)array[0]; 
for(int i=1; i<= size;++i) 
    printf("%s",array[i]); 

またはあなたのアレイ終了NULL可能性

のchar *配列[] = { "1"、 "二"、(CHAR *)0}。

for(int i=0;array[i]!=0;++i) 
{ 
    printf("%s",array[i]); 
} 
0

ポインタから配列サイズを取得することはできません。 NULLポインタで配列を終了することができます。あなたの関数は、NULLポインタを検索してサイズを知ることができます。あるいは、単にNULLをヒットした入力の処理を止めるだけです...

2

Cはあなたの背中の背中をトリッキーにしています。

void foo(int array[]) { 
    /* ... */ 
} 

void bar(int *array) { 
    /* ... */ 
} 

これらの両方が同一である:

6.3.2.1.3:それは、sizeof演算子または単項&演算子のオペランドである または初期化するために使用されるリテラル文字列である場合を除き配列 の型 ''の配列 ''を持つ式は、配列オブジェクトの最初の要素を指し、左辺の値ではない型 ''型へのポインタ '' の式に変換されます。 配列オブジェクトにレジスタ記憶クラスがある場合、その動作は未定義です。

その結果、あなたは知らない、あなたは配列と呼ばれる 、単一 整数への配列の部分、またはポインタであればfoo()またはbar()、内側:

彼らは本当に 配列、 ではなく、渡されなかったことだけで自分自身を思い出させるために void foo(int *array)
int a[10]; 
int b[10]; 
int c; 

foo(a); 
foo(&b[1]); 
foo(&c); 

一部の人々は次のようにその機能を書くのが好き整数へのポインタであり、それ以外の場合は の整数が他にもあります。いくつかの人々は のような関数をのように書いて、 関数がそれに渡されることをよりよく思い出させたいと思っています。あまりにも長paramenterに沿って

  1. パス:

    にかかわらず、あなたは あなたの配列がどのくらいかを知りたい場合は、それをしたいどの方法を、あなたはいくつかのオプションを持っています。 (Think int main(int argc, char *argv))。

  2. 最後の 要素を除くすべての要素がNULLでないように配列を設計します。 (char *s="almost a string";またはexecve(2)を考えてください)
  3. 引数の他の記述子を使用するように関数を設計します。 (考えてprintf("%s%i", "hello", 10); - 文字列は 他の引数を説明しますprintf(3)stdarg(3)引数処理を使用しますが、 と同じように簡単に配列できます。)
+1

trivia: 'argv'はポイント1とポイント2の両方を行います。 – u0b34a0f6ae

関連する問題