C预期输出失败

时间:2018-01-25 04:26:43

标签: c output

这是我的程序。我正在尝试查找字符串中每个字符的频率并显示它。在回答时请注意我不想尝试ASCII概念,我想知道这个概念有什么不对。

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

int main()
{
int l=0,j,k,m,count[10000];
char string[10000];
printf("Enter the string : \n");
scanf("%s",string);
l=strlen(string);
printf("%d",l);
for(j=0;j<l;j++)
    {
        for(k=j+1;k<l;k++)
        {
            if(string[j]==string[k])
            {
                count[j]++;
            }
        }
    }
for(m=0;m<l;m++)
    {
       printf("%d",count[m]);
    }
return 0;
}

2 个答案:

答案 0 :(得分:1)

以下是问题:

  1. 您已撰写:I am trying to find the frequency of each character,但您的代码正在尝试计算字符对之间相关性的直方图。
  2. 作为您使用count的{​​{1}}的索引,它在字符串中迭代组成字符。这意味着您的表格j有很多count,只有一些0而没有其他内容。
  3. 所以目前这不是字符对的直方图,也不是字符的直方图。
  4. 可以像这样创建字符直方图:

    1

    生成字符关联矩阵:

    void makeStrHistogram(char *str, int histogram[256])
    {
        memset(histogram, 0, sizeof(histogram));
        while (*str) histogram[*str++]++;
    }
    
    void printHistogram(int histogram[256])
    {
        for (int i=0; i<256; ++i) {
           if (histogram[i]) {
                printf("%c - %d\n", (char)i, histogram[i]);
           }
        }
    }
    

答案 1 :(得分:1)

因此,您希望找到字符串中字符的频率。

关于代码中的错误:

  • 考虑字符串lalal在这里,您将计算最后l两次,一次对应于第一个l,第二次对应第三个l。因此,你的逻辑是错误的。
  • 类似count[]的情况。您尚未初始化数组,因此它包含垃圾值

因此,解决问题的另一种方法是声明一个26元素的数组(英文字母),遍历整个列表,并在找到该元素时增加与每个元素对应的计数。

int frequencyChar[26] = {0};//stores frequency of characters [a-z], initialized to zero

for( i=0; i<strlen(str); i++) //iterate through the entire string
{
    frequencyChar[str[i] - 'a']++; //increment count corresponding to each element
}

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

P.S.Above代码假设字符串中只包含小写字符。小的改动将允许包含大写字母!