我还在学习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;
}
从这里我应该得到一些看起来像:
a b c
2 1 4
我只是想知道是否有更简单的方法来做这个,有人可以指出我或在我开始使用这个方法之前给我一个例子。
答案 0 :(得分: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;
}
使用重要名称命名变量是一种更好的做法。对于您和其他可以阅读代码的人来说,这将更容易阅读。
答案 1 :(得分:0)
如果您使用counting sort,则会获得更少的代码:
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");
答案 2 :(得分: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]);
}
}
}