0

たとえば、1000 要素の int 配列があります。ユーザーが 128 を入力すると、配列が 821 として埋められます。言う前に、他の機能を簡単にするために、逆にする必要があります。私が使用する長さを取得するには

    int count = 0;
    for (int i = 0; array1[i] != '\0'; ++i)
    {
        count++;
    }       

これはうまくいきます。0 や 100 など、0 を含む数値を入力するまで。配列は 001 として埋められますが、0 は '\0' に等しいため、テストはすぐに停止します。

sizeof(array1)/sizeof(*array1) を使用できないのは、配列を印刷しようとすると、大量のゼロの後に数字が続くためです。正しく印刷されますが、私が望むものではありません。

解決策はありますか?

4

4 に答える 4

1

より良い方法は、使用する前に配列全体を無効な値 (-1 など) で埋めることだと思います。「無効」と言うと、説明によると、0〜9以外の値になります。

memset(array1, -1, sizeof(array1));
// doing things

また、数字はユーザー入力によるものなので、数字を文字として保存してみませんか? '\0' の代わりに '0' を使用してゼロを表すだけで、問題は発生しません。strlen配列の末尾に常に '\0' があることが保証されている場合は、長さを直接取得するために使用することもできます。

// array size is 1001 instead of 1000 to reserve a '\0' in the end
char array1[1001] = {'8', '2', '1'}
size_t count = strlen(array1);
于 2012-09-28T06:34:32.013 に答える
0

あなたがする必要があるのは、数字を対応する文字に変換することです。

としましょう1230。配列には、実際には1 + '0'、、、およびを格納します。印刷されたキーのASCII値です。2 + '0'3 + '0''0''0'0

そうすれば、と混同することはありませ'0'\0

于 2012-09-28T06:35:14.220 に答える
0

数値の桁数を決定してから、計算されたサイズで配列を動的に割り当てることができます。

于 2012-09-28T06:35:58.723 に答える
0

私が考えることができる2つのアプローチがあります:

  1. ユーザーが入力する各要素の後にサイズを大きくします
  2. ユーザーが決して入力しない数字で終わりをマークします

たとえば、最初のケースでは:

char array1[1000];
int count = 0;

while(!the_end)
{
    std::cin >> array1[count++]
}

// From now, every time you add elements to the array, increase  the "size" variable

std::cout << "Size: " << count << std::endl;

2 番目のケースについては、いくつかの方法がありますが、ユーザーからの入力を取得する前に、無効な値で配列を満たすことによって、どの方法が最適だと思いますか。

char array1[1000] = {-1};
// Start getting the input...

int count = 0;
for(int i = 0; array1[i] != -1; ++i)
{
    count++;
}

std::cout << "Size: " << count << std::endl;

注:これで行き詰まっている場合は、コードに設計上の欠陥がある可能性があります。デザインを良くするために、私が提案した最初のアプローチを使用し、後でサイズを見つけようとはしません. または、解説で提案されているように使用するstd::vectorか、少なくとも配列に入力する要素に対して何らかのタイプの「追跡」を行うことができます。

于 2012-09-28T06:40:26.357 に答える