计算字符串或文件中的字符

Counting characters in a string or file

我有以下代码:

#include "stdafx.h"
#include "string.h"
#include "ctype.h"
/*selection sort*/
void swap(int A[], int j, int k)
{
int p = A[k];
int i;
for (i = 0; i < (k - j); i++)
{
    A[k - i] = A[k - i - 1];
}
A[j] = p;
}
/*greatest number in an array*/
int max(int A[], int N, int k)
{
int max = k, i;
for (i = k; i < N; i++)
{
    if (A[max] < A[i])
        max = i;
}
return max;
}
int count_nonspace(const char* str)    
{
 int count = 0;
 while(*str)
 {
  if(!isspace(*str++))
   count++;
 }
 return count;
}


int _tmain(int argc, _TCHAR* argv[])
{
    int a[256];
    int i = 0, j = 0, count[256] = { 0 };

    char string[100] = "Hello world";
    for (i = 0; i < 100; i++)
    {
    for (j = 0; j<256; j++)
    {
        if (tolower(string[i]) == (j))
        {
            count[j]++;
        }
    }
    }
    for (j = 0; j<256; j++)
    {

    printf("\n%c -> %d \n", j, count[j]);

    }
}

程序正在计算字符串中每个字符的出现次数。现在它打印所有 256 个字符的出现次数,而我希望它只打印字符串中出现次数最多的字符。我的想法是对具有出现次数的数组使用选择排序方法,但这不起作用,因此我的问题是如何只打印字符串中出现次数最多的字符?

如果有人有疑问,这不是我的作业题。

编辑:我刚刚注意到这段代码 printf 出现了以 "j" 开头的字符,这是为什么?

  1. 创建一个以您的字符为索引的数组。
  2. 根据读取的字符继续增加数组中的值。
  3. 现在从数组中获取最大值,它为您提供输入中出现次数最多的字符。

代码如下所示:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void) {
    char buf[100];
    int i=0,max =0,t=0;
    int a[256];
    memset(a,0,sizeof(a));
    fgets(buf,100,stdin);
    buf[strlen(buf)-1] = '[=10=]';
    while(buf[i] != '[=10=]')
    {
        a[(int)buf[i]]++;
        i++;
    }
    i=0;
    for(i=0;i<256;i++)
    {
        if(a[i] > max)
        {
            max = a[i];
            t = i;
        }
    }
    printf("The most occurring character is %c: Times: %d",t,max);
    return 0;
}

这是一个解决方案,基于您自己的解决方案,并使用 qsort()

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

struct Frequency
{
    int character;
    int count;
};

int compare(const void *const lhs, const void *const rhs)
{
    return ((struct Frequency *)rhs)->count - ((struct Frequency *)lhs)->count;
}

int main(int argc, char* argv[])
{
    int i = 0, j = 0;
    struct Frequency count[256];

    memset(&count, 0, sizeof(count));

    char string[100] = "Hello world";
    for (i = 0 ; i < 100 ; i++)
    {
        for (j = 0 ; j < 256 ; j++)
        {
            count[j].character = j;
            if (tolower(string[i]) == j)
            {
                count[j].count += 1;
            }
        }
    }
    qsort(count, sizeof(count) / sizeof(*count), sizeof(*count), compare);

    /* skip the '[=10=]' which was counted many times */
    if (isprint(count[1].character))
        printf("\nThe most popular character is: %c\n", count[1].character);
    else
        printf("\nThe most popular character is: \%03x\n", count[1].character);

    for (j = 0 ; j < 256 ; j++)
    {
        if (isprint(count[j].character))
            printf("\n%c -> %d \n", count[j].character, count[j].count);
        else
            printf("\n\%03x -> %d \n", count[j].character, count[j].count);
    }
}

请注意 '[=15=]' 已为

中的所有剩余字节设置
char string[100] = "Hello world";

因此 '[=15=]' 的计数将是最高的。

您可以在计数循环中使用 strlen() 跳过 '[=15=]',但不要

for (i = 0 ; i < strlen(string) ; ++i) ...

这样做

size_t length = strlen(string);
for (i = 0 ; i < length ; ++i) ...

我在其他人出现之前就开始打字了,所以无论如何我都会 post。这可能是最有效的(提高效率会增加一些混乱)获得答案的方法,但它不包括忽略空格、不考虑大小写计算字符等的代码(容易修改)。

most_frequent(const char * str)
{
    unsigned        counts[256];
    unsigned char * cur;
    unsigned        pos, max;

    /* set all counts to zero */
    memset(counts, 0, sizeof(counts));
    /* count occurences of each character */
    for (cur = (unsigned char *)str; *cur; ++cur)
        ++counts[*cur];

    /* find most frequent character */
    for (max = 0, pos = 1; pos < 256; ++pos)
        if ( counts[pos] > counts[max] )
            max = pos;

    printf("Character %c occurs %u times.\n", max, counts[max]);
}