2

私はこのプログラムを読みましたが、理解できません。配列で何が起こっているのか正確に説明してくださいlength[]。さまざまなタイプの文字、つまり数字と文字の両方を格納するためにどのように使用できますか。コードは次のとおりです。

#include <stdio.h>
#define EOL '\n'
#define ARYLEN 256
main()
{
    int c, i, x;
    int length[ARYLEN];
    for(x = 0; x < ARYLEN;x++)
        length[x] = 0;
    while( (c = getchar() ) != EOL)
     {
        length[c]++;
    if (c == EOL)
        break;
    }    
    for(x = 0; x < ARYLEN; x++)
    {
         if( length[x] > 0){
            printf("%c | ", x);
            for(i = 1; i <= length[x]; ++i){
                printf("*");
         }
         printf("\n");
         }
     }
}
4

2 に答える 2

2

配列には文字は格納されません (少なくとも概念的には)。cプログラムがindex の配列位置にある数値を持つ文字に遭遇した回数を格納しますc

基本的に、C プログラミング言語では、 acharは 8 ビットで構成されるデータ型であり、 an の場合は 0 ~ 255、 a のunsigned char場合は -128 ~ 127の範囲の値を保持できますsigned char。次に、プログラムは、一意の値ごとに 1 つの配列位置を
使用して表すことができる限り多くの異なる値を保持するのに十分な大きさの配列を定義します。次に、適切な配列位置をその特定の値のカウンターとしてchar使用して、出現回数をカウントします。length[c]配列をループしてデータを出力するとき、ループ内の現在のインデックスを見るだけで、データがどの文字に属しているかを知ることができprintf("%c | ", x);ますlength[x]

于 2013-06-03T07:35:30.910 に答える
1

length[]あなたのコードでは、文字を格納するために整数配列が使用されていません。入力された各文字の数を格納するためにのみ使用されます。文字は 1 つずつ文字変数に読み込まれますc while( (c = getchar() ) != EOL)

しかし、トリッキーな部分はlength[c]++;. 各文字のカウントはASCII value - 1、配列内の同じ位置に保持されlength[]ます。

たとえば、コードを使用するシステムASCIIでは、 は のコードであるためlength[64]、 のカウントが含まれます。A65ASCIIA

length[65]は のコードでBあるため、 の数が含まれています。66ASCII-8B

length[96]は のコードでaあるため、 の数が含まれています。97ASCIIa

length[47]は のコードで0あるため、 の数が含まれています。48ASCII0

于 2013-06-03T07:34:23.363 に答える