-1

Cを使用して配列内の要素の数を数えようとしています。次のコードを試しました。しかし、プログラムを実行するたびに 83 が返されます。要素の数を数えるということは、配列のサイズではなく、入力した要素の数を知る必要があるということです。

 #include<stdio.h>
#include<stdlib.h>
main(){

int a[100], j = 0, i;

a[0] = '0';
a[1] = '1';
a[2] = '2';
a[3] = '3';
a[4] = '4';
a[5] = '5';

for(i=0; i<100; i++){

       if(a[i] == '\0'){

       }        
        else
            j = j + 1;          
}

printf("%d", j);

system("pause");
}
4

4 に答える 4

2

C の配列は固定サイズです。それらは拡張しません。array2 つのエントリがあります。、などへの書き込みはarray[2]未定義の動作を引き起こします。つまり、無効なコードです。array[3]

任意の数の要素を挿入できるようにする場合は、動的に割り当てられたメモリを使用し、挿入した要素の数を手動で追跡し、reallocサイズ変更が必要なときに使用する必要があります。

于 2012-07-21T11:24:38.727 に答える
1

代わりにこれを行います:

main(){

  int a[100] = {0};
  int j = 0;
  int i = 0;

  // other stuff
于 2012-07-21T16:50:57.790 に答える
1

OP が彼のコードを修正したため、より正しい応答があります。以前に配列を初期化していないため、このコードは「偶然に」機能します。どこかで値 0 が出てくるのはただの「運」です。

配列の宣言はそれをゼロにしません。使用する:

memset(a, 0, 100);

そのために。そうすれば、最初の「上書きされない」バイトは「0」を返します。参照: http://www.cplusplus.com/reference/clibrary/cstring/memset/

または、a[x] = 0; を追加して、「区切り」を手動で設定する必要があります。

さて、あなたが具体的に「C」ソリューションを求めていることは知っていますが、C++ コンパイラの使用を検討したい場合は、C++ の stl を参照することをお勧めします。開始するためのリンクは次のとおりです: http://www.cplusplus.com/reference/stl/list/

次のように初期化されます。

list<char>List;
List.push_back(1);
List.push_back(2);
List.push_back('a');

int j = List.size();   //Returns '3'
于 2012-07-21T11:25:49.933 に答える
0

新しいコードに基づく更新:

一般に、正しいカウントを行うには、配列の末尾を識別する方法が必要です。文字列の場合、'\0'が一般的に使用されます。他のデータ型については、チェックする独自の値を考え出す必要があります。

上記の特定のコード例の場合:

\0カウントが機能するように、配列の最後の位置に自分自身を挿入する必要があります。(「hello」のような文字列を作成すると、文字列'\0'の最後に が自動的に挿入されますが、文字列を 1 文字ずつ作成した場合はそうではありません)。

または、文字をチェックして、'5'現在の文字配列の末尾を見つけます。

また、break最後の文字を見つけたら、ループから抜け出す必要があります。そうしないと、配列の末尾を超えてしまい、クラッシュする可能性が高くなります (そうでない場合は、運が悪いだけです)。つまり、次のようなものです。

   if(a[i] == '\0'){
      break;
   }

次の場合に機能します。

   a[6] = '\0';

前。

C は配列の境界をチェックしないので、現在のコードではこれを回避しているように見えるかもしれませんが、プログラムがクラッシュせず、実行ごとに変更される可能性があるのはまったくの幸運です。つまり、これは未定義の動作です。

最後に、もちろんstrlen()、文字列を扱っている場合にも使用できます。

于 2012-07-21T11:24:25.177 に答える