1

我试图在字符串中查找字符频率,我编写了以下代码,但它没有显示任何输出。我试图用各自的计数填充字符数组。

当我尝试调试时,它会给出一些输出,但会打印一些垃圾值。

#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]++;         
    }            
 }
4

6 回答 6

6

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

  1. count数组未初始化。

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

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

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

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

  5. 为 charcount() 声明正确的原型。

修复这些后:

#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。

于 2013-07-19T06:21:44.123 回答
2

你需要初始化你的count数组。否则默认情况下它会有垃圾值。您可以将整个数组初始化为0

int count[100] = {0};
于 2013-07-19T06:15:48.450 回答
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] = {};
于 2013-07-19T06:18:21.240 回答
1

您的count数组可能不够大,无法容纳所有可打印的值(即使假设为 ASCII),它应该初始化为 0。您的for循环应该检查 的长度var,而不是count,因为您不能明智地将 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]);                         
}
于 2013-07-19T06:22:29.140 回答
0

JAVA程序打印“*”的次数与字符串中字符的出现次数一样多。或者 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:* u:* r:* s:* e:** l:* f:*

于 2018-10-14T19:12:37.663 回答
-1

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

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

于 2013-07-19T06:18:48.660 回答