2017-01-20 15 views
-1

'\0'が宣言の間に有効になるように、int配列内の要素の正確な数を見つけなければなりません。値'\0'は、0 .i.e ('\0' == 0) = trueに相当します。int配列のユーザー定義要素の数を調べる方法は?

#include<iostream.h> 

int getsize(int arr[]) 
{ 
    int i = 0,p=1;// initialized to 1 as, if left un-initialised it suffers from undefined behaviour 
    while(p!=NULL) 
    { 
     i++;p=arrr[i]' 
    } 

    return i; 
} 

それがメインに呼び出されたときのコードのように正常に動作します:

void main() 
{ 
    int testarr[10]={0,5}; 
    cout<<"\nThe size is : "<<getsize(testarr); 
} 

しかしtestarr[]int testarr[10]={5,0}

に変更されたときに出力が

The size is : 1 

なり問題は、私が残念ながらrである、先史時代のターボC++コンパイラint0'\0'と同じです。代わりにNULLを使用しましたが、コードが機能していないようです。私は行方不明のものがありますか?

+0

_user-defined要素とは_ですか? – Danh

+0

一般に、配列の要素を調べることで配列のサイズを見つけることはできません。特殊なケースとして、文字の配列をリテラル文字列に初期化することができます。コンパイラはそれをヌル終了します。これは整数配列ではできません。 –

+0

nullポインタを確認できない – Dhruva

答えて

1

int配列のユーザー定義要素の数を調べるにはどうすればよいですか?

コンパイラによって生成されたゼロから、プログラマによって指定されたゼロを区別する方法はありません。

問題は、私が残念ながら制限されている、先史時代のturbo C++コンパイラが、int 0と '\ 0'を同じに読んでしまうことです。

この動作は古代のコンパイラに固有のものではありません。すべてのC++コンパイラに当てはまります。 0の値は、'\0'とまったく同じです。ただし、プログラムには'\0'が含まれていません。


while(p!=NULL) 

NULLと整数を比較しないでください。これは、あなたのコードを読んでいる人を混乱させるでしょう(標準ライブラリがNULLをどのように定義したかによって、C++ 11が不正な形式になる可能性があるので)。これはゼロとの比較に等しいので、while(p)を使用してください。

あなたの関数が何

は、ゼロに到達するまでの配列が終了しない場合、最初の値が無視され、常に1としてカウントされることを除いて、それは、配列内の非ゼロ要素の数をカウントしています0(最初の位置以外の位置)であれば、配列は境界を超えてアクセスされ、UBが存在します。

本質的にはstrlenと同じように動作しますが、整数の場合は最初の要素が異なって扱われます。

だから、期待される出力は次のようになります。

{0,0,1,2} -> 1 
{0,1,0,0} -> 2 
{1,0,0,0} -> 1 
{0,0,0,0} -> 1 
{0,1,2,0} -> 2 
{0,1,2,3} -> Any or no output is expected, because UB 

は私がnullポインタのためにあなたの配列はポインタを含んでいない

番号を確認することができません。整数を含みます。

testrarr[10]={5,0}デフォルトでは、初期化時にそれが\0別名ヌル文字ではないnullpionterとして、アレイ内のすべての値を満たす、と -

号は、配列は整数が含まれているので、それはヌルで満たされていませんキャラクター。ゼロ初期化では、ゼロの整数(これはヌル文字と同じ値を持つため、区別が微妙です)で配列を塗りつぶします。

1

Cは、用語「アレイ」を少し誤って使用します。配列はデータの編成であり、バッファはデータを格納する場所です。したがって、Cでバッファを宣言すると、10個の整数の配列ではなく10個の整数を保持できるバッファが宣言されます。実際、値は「不正な整数」のトラップ表現である可能性があります。

あなたは

int testarr[10] = {0,5}; 

を行うと、あなたが10の整数のバッファ、および2つだけの配列を持っています。しかし、部分的に配列/バッファの混乱が深刻になっているため、Cはあなたに言わないでしょう。それは今N.、別の値を維持するために

int testarr[10] = {0, 5}; 
int N = 2; 

を通常必要だ我々はサブルーチンに配列を渡すとき、我々はまた、合計呼び出すことができますアドレス、プラスN.

int sum(int *x, int N) 
{ 
    int answer = 0; 
    int i = 0; 

    for(i=0;i<N;i++) 
     answer += x[i]; 

    return answer; 
} 

int testarr[10] = {0, 5}: 
int N = 2; 

total = sum(testarr, N); 

注意を渡します配列スライス上、または動的に割り当てられた配列上に存在します。この関数は、データの後の未使用の整数スロット、またはデータが静的であるか、スタック上か、ヒープ上にあるかどうかを完全に認識しません。

関連する問題