0

私はまだCを学んでおり、配列内の文字の出現を数える最良の方法を見つけようとしています.

私はそれを関数に分けて、それを大きく拡張する予定ですが、これまでのところ、私が思いついた最高の作業コードは、これのより大きなバージョンです:

#define SIZEONE 7
#define SIZETWO 3


int main(void)
{
    int arrOne[SIZEONE] = {97, 97, 98, 99, 99, 99, 99};
    char arrTwo[SIZETWO] = {'a', 'b', 'c'};
    int arrThree[SIZETWO] = {0};
    int countOne = 0;
    int countTwo = 0;
    int countThree = 0;
    
    for(countOne = 0; countOne < SIZEONE; countOne++)
    {
        for(countTwo = 0; countTwo < SIZETWO; countTwo++)
        {
            if(arrOne[countOne] == arrTwo[countTwo])
            {
                arrThree[countTwo] = arrThree[countTwo] + 1;
            }
        }
    }
    
    for(countThree = 0; countThree < SIZETWO; countThree++)
    {
        printf("%c ",arrTwo[countThree]);
    }
    
    countThree = 0;
    printf("\n");
    
    for(countThree = 0; countThree < SIZETWO; countThree++)
    {
        printf("%d ",arrThree[countThree]);
    }
    return 0;
}

これから、次のようなものが得られるはずです。

abc

2 1 4

この方法を使い始める前に、誰かが私を指し示したり、例を示したりできる、これを行うためのより簡単な方法があるかどうか疑問に思っています。

4

3 に答える 3

1

すべての配列サイズの例として、この関数を挿入することができます:

int findOccurences(const char *array, const int array_size, const char ch_to_find)
{
    int found = 0;
    for(int i = 0; i < array_size; ++i)
    {
        if(array[i] == ch_to_find) found++;  
    }
    return found;
}

変数に意味のある名前を付けることをお勧めします。これは、あなたにとっても、あなたのコードを読める他の人にとっても読みやすくなります。

于 2013-10-10T13:05:17.683 に答える
0

カウントソートを使用すると、得られるコードが少なくなります。

long count[1u << CHAR_BIT]; 

char *text = "The string we want to count characters in";
long i;

// Clear count array
memset(count, 0, sizeof(count));

// Count characters
for (i = strlen(text) - 1; i >= 0; i--) {
  count[(unsigned char)text[i]]++;
}

// Print occurance:
for (i = 0; i < 1u << CHAR_BIT; i++) {
  if (count[i] > 0) {
    printf("%4c", i);
  }
}
printf("\n");
for (i = 0; i < 1u << CHAR_BIT; i++) {
  if (count[i] > 0) {
    printf("%4ld", count[i]);
  }
}
printf("\n");
于 2013-10-10T13:04:42.473 に答える
0

最良の方法は、256 (ASCII のみの場合は 127) のカウント配列を定義し、それをゼロにし、出現ごとにカウント配列をインクリメントすることです。

void count_chars(char* arr)
{
  int counting[256],i;
  memset(counting,0,sizeof(counting));
  for(i=0; arr[i];++i){
    ++counting[(unsigned char)arr[i]];
  }
  for(i=0; i<256;++i){
    if(counting[i]){
      printf("%c - %d\n", (char)i, counting[i]);
    }
  }
}
于 2013-10-10T13:11:42.730 に答える