C - 查找char数组中最常见的元素

时间:2012-03-01 09:38:12

标签: c arrays

我正在开发一个小函数来显示(char)数组中最常见的字符。 这是我迄今为止所取得的成就,但我认为我的方向错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

char test[10] = "ciaociaoci";
max_caratt(test, 10);

}

int max_caratt(char input[], int size)
{
int i;
char max[300];
max[0] = input[0];

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

    if(strncmp(input,input[i],1) == 1)
    {
        printf("occourrence found");
        max[i] = input[i];
    }


}

}

任何帮助?

7 个答案:

答案 0 :(得分:7)

实际上,正确的代码是这样的。
它只是IntermediateHacker下面片段的修正版本。

void main()
{

int array[255] = {0}; // initialize all elements to 0

char str[] = "thequickbrownfoxjumpedoverthelazydog";

int i, max, index;

for(i = 0; str[i] != 0; i++)
{
   ++array[str[i]];
}


// Find the letter that was used the most
max = array[0];
index = 0;
for(i = 0; str[i] != 0; i++)
{
     if( array[str[i]] > max)
     {
         max = array[str[i]];
         index = i;
     }
}

printf("The max character is: %c \n", str[index]);

}

答案 1 :(得分:2)

找到最常见字符的最简单方法是创建一个255的int数组,并只增加与该字符对应的arraly元素。例如:如果字符为'A',则递增'A'元素(如果查看任何ascii表,您将看到字母'A'的小数值为65)

int array[255] = {0}; // initialize all elements to 0
char str[] = "The quick brown fox jumped over the lazy dog.";
int i, max, index;
// Now count all the letters in the sentence
for(i = 0; str[i] != 0; i++)
{
   ++array[str[i]];
}
// Find the letter that was used the most 
max = array[0];
index = 0;
for(i = 0; str[i] != 0; i++)
{
     if( array[i] > max)
     {
         max = array[i];
         index = i;
     }
}

printf("The max character is: %c \n", (char)index);

答案 2 :(得分:1)

您将(几乎)字符串和字符传递给strncmp()strncmp()需要两个字符串(和一个整数)。你的程序甚至不应该编译!

建议:提高编译器的警告级别,注意警告

您可能需要查看strchr() ...

答案 3 :(得分:1)

假设输入数组为0-127,以下内容应该会在单个字符串传递中获得最常见的字符。请注意,如果您想担心负数,请根据需要将所有内容调高+127 ......

char mostCommonChar(char *str) {

  /* we are making the assumption that the string passed in has values 
   * between 0 and 127.
   */
  int cnt[128], max = 0;
  char *idx = str;

  /* clear counts */
  memset((void *)cnt, 0, sizeof(int) * 128);

  /* collect info */
  while(*idx) {
    cnt[*idx]++;
    if(cnt[*idx] > cnt[max]) {
        max = *idx;
    }
    idx++;
  }

  /* we know the max */
  return max;
}

答案 4 :(得分:0)

如果您不需要保留输入数组,则可以先对输入数组进行排序,然后找到单个字符的最长连续运行。这种方法较慢,但使用的空间较少。

答案 5 :(得分:0)

我使用结构制作了一个工作版本。我猜,它运行正常,但我认为有更好的方法来编写这个算法。

#include <stdio.h>
#include <stdlib.h>

struct alphabet {
    char letter;
    int times;
};

typedef struct alphabet Alphabet;

void main() {

    char string[300];

    gets(string);


    Alphabet Alph[300];

    int i=0, j=0;

    while (i<=strlen(string)) {
        while(j<=300) {
            if(string[i] != Alph[j].letter) {
                Alph[i].letter = string[i];
                Alph[i].times = 1;
            }
            else {
                Alph[j].times++;
            }
            j++;
        }

        j=0;
        i++;
    }



    int y,max=0;
    char letter_max[0];
    for (y=0; y<strlen(string); y++) {

        printf("Letter: %c, Times: %d \n", Alph[y].letter, Alph[y].times);

        if(Alph[y].times>max) {
            max=Alph[y].times;
            letter_max[0]=Alph[y].letter;
        }

    }

    printf("\n\n\t\tMost frequent letter: %c - %d times \n\n", letter_max[0], max);


}

答案 6 :(得分:0)

我看到你们都在创建大数组和“复杂”的东西,所以在这里我有简单易用的代码xD

indexed and assoc