在字符串中查找字符频率

时间:2013-07-19 06:07:39

标签: c arrays pointers

我试图在一个字符串中找到字符频率,我写了下面的代码,但它没有显示任何输出。所有我尝试的是用各自的计数填充字符数组。

当我尝试调试时,它会提供一些输出,但会输出一些垃圾值。

#include<stdio.h>
/* Program for printing character frequency in string */
charcount(char *,int *);
int main()
{
    int n,i=0;
    printf("Enter n :");
    scanf("%d",&n);
    char var[n];
    int count[100];                    // array for storing character frequency   
    printf("Enter string :");
    fflush(stdin);
    scanf("%s",var);
    charcount(var,count);             // calling frequeny function
    for(i=0;i<strlen(count);i++)
    {
       printf("%d\n",count[i]);                         
    }
    getch();
    return 0;
}

 charcount(char *p,int *q)
 {
    for(;*p;p++)
    {
       q[*p]++;         
    }            
 }

6 个答案:

答案 0 :(得分:6)

您的代码中几乎没有问题:

  1. count数组未初始化。

  2. 您正在对整数数组应用strlen()。

  3. count数组应为256(count[256])以覆盖所有可能的ascii字符。例如,如果您的输入为abcd,那么当d为100时,您将超出数组范围。

  4. 您正在打印错误的计数:

    printf("%d\n",count[i]);应为printf("%d\n",count[var[i]]);

  5. 为charcount()声明适当的原型。

  6. 修好后:

    #include<stdio.h>
    /* Program for printing character frequency in string */
    void charcount(char *,int *);
    int main()
    {
        int n,i=0;
        printf("Enter n :");
        scanf("%d",&n);
        char var[n];
        int count[256]={0};                    // array for storing character frequency   
        printf("Enter string :");
        scanf("%s",var);
        charcount(var,count);             // calling frequeny function
        for(i=0;i<strlen(var);i++)
        {
           printf("%d\n",count[var[i]]);                         
        }
        return 0;
    }
    
    void  charcount(char *p,int *q)
     {
        for(;*p;p++)
        {
           q[*p]++;         
        }            
     }
    

    确保在C99或C11(例如gcc -std=c99 file.c)模式下进行编译,因为早期的C标准不支持VLA。

答案 1 :(得分:2)

您需要初始化count数组。否则,默认情况下它将包含垃圾值。您可以将整个数组初始化为0,如下所示:

int count[100] = {0};

答案 2 :(得分:1)

int count只是一个散列图

您的代码不适用于此字符串“abcd”

count['a'] = val // Works fine ASCII value of a is 97
count['b'] = val // Works fine ASCII value of a is 98
count['c'] = val // Works fine ASCII value of a is 99
count['d'] = val ; // Undefined Behaviour ASCII value of d is 100 

大小应等于ASCII设定长度

int count[128] = {};

答案 3 :(得分:1)

您的count数组可能不足以容纳所有可打印的值(即使假定为ASCII),并且它应该初始化为0。您的for循环应检查var的长度,而不是count,因为您无法明智地将计数整数数组视为字符串。

int count[1<<CHAR_BIT] = {};
/*...*/
for(i=0;i<strlen(var);i++)
{
   printf("%d\n",count[var[i]]);                         
}

嗯,这实际上取决于你想要输出的内容。如果您打算输出所有count,那么:

for(i=0;i<sizeof(count)/sizeof(count[0]);i++)
{
   printf("%d\n",count[i]);                         
}

答案 4 :(得分:0)

  

JAVA程序打印“ *”的次数与String中字符出现的次数相同。   或char_in_String:char_in_String的频率   代替*您可以打印频率计数

public class CharFreq
{
        public static void main(String[] args)
        {
                String s = "be yourself ";                                                                                System.out.println(s);
                int r=0;
                char[] str = s.toCharArray();
                for (int i = 0; i < str.length; i++)
                {
                        int cnt = 0;
                        if (str[i] != ' ')
                        {
                                for (int j = 0; j < str.length; j++)
                                {
                                        if (str[i] == str[j])
                                        {
                                                cnt++;                                                                                                    r=j;
                                        }
                                }

                                if(i==r)
                                {
                                        System.out.print(str[i] + ":");
                                        for (int k = 1; k <=cnt; k++)
                                                System.out.print("*");
                                        System.out.println();
                                }
                        }
                }
        }
}
  

输出:   做你自己   b:*   y:*   o:*   你:*   r:*   s:*   e:**   l:*   f:*

答案 5 :(得分:-1)

您的count[100]不够大。假设你只输入“A - Z”或“a - z”它仍然不够大,因为'z'是122,那么你的charcount会增加计数[122]。

您应该考虑将int count[100]更改为int count[128] = { 0 }