【问题标题】:C Expected Output Failure [closed]C预期输出故障[关闭]
【发布时间】:2018-01-25 04:26:43
【问题描述】:

这是我的程序。我正在尝试查找字符串中每个字符的频率并显示它。回答时请注意我不想尝试 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;
}

【问题讨论】:

  • 预期行为是什么,实际行为是什么?将其添加到问题中。
  • ASCII 概念是什么意思?
  • 问题是count[10000]; 需要9872 更多的整数(和39488 字节的堆栈空间),而不是使用“ASCII 方法”计算每个 ASCII 字符。
  • 问题仍然缺少minimal reproducible example

标签: c output


【解决方案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 代码假定字符串中只有小写字符。微小的变化将允许包含大写字母!

【讨论】:

    【解决方案2】:

    以下是问题:

    1. 您已编写:I am trying to find the frequency of each character,但您的代码正在尝试计算字符对之间相关性的直方图。
    2. 作为count 的索引,您使用的是j,它遍历字符串中的组成字符。这意味着您的表count 有很多0,只有一些1,没有别的。
    3. 所以目前这不是字符对的直方图,也不是字符的直方图。

    字符直方图可以这样创建:

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

    生成字符相关矩阵:

    void correlationMatrixForStr(char *str, int matrix[256][256])
    {
        memset(matrix, 0, sizeof(matrix));
        int len = strlen(str);
        for (int i=0; i<len; ++i) {
            for (int j=i+1; j<len; ++j) {
                matrix[i][j]++;
            }
        }
    }
    

    【讨论】:

    • ...FGITW 效应导致答案中的拼写错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2017-03-03
    • 2023-03-09
    相关资源
    最近更新 更多