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

时间:2015-01-19 15:19:55

标签: c string printf histogram

我有以下代码:

#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个字符的外观数量,而我希望它只打印字符串中具有最大外观数量的字符。我的想法是使用选择排序方法对数组使用外观的nubmer,但是这不起作用,因此我的问题是如何只打印字符串中具有最大外显数的字符?

如果有人怀疑,这不是我的功课问题。

编辑:我刚才注意到这个代码printf出现了以“j”开头的字符,为什么会这样?

3 个答案:

答案 0 :(得分:1)

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

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]);
}

答案 1 :(得分:0)

  1. 使用您的char作为索引创建一个数组。
  2. 根据读取的字符继续增加数组中的值。
  3. 现在从数组中获取最大值,这将为您提供输入中最常出现的字符。
  4. 代码如下:

    #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] = '\0';
        while(buf[i] != '\0')
        {
            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;
    }
    

答案 2 :(得分: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 '\0' 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);
    }
}

请注意,

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

所以'\0'的数量将是最高的。

您可以在计数循环中使用strlen()跳过'\0',但不要

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

这样做

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