C中的数字频率计算代码不起作用

Digit Frequency calculating code in C not working

所以,我正在编写这段代码来计算数字频率,即 0-9 数字在用户输入的字符串(字母数字)中出现的次数。因此,我将字符串转换为整数并尝试将频率存储在“计数”中并打印出来,但是当我 运行 代码时,计数永远不会增加,输出全为 0。如果有人指出我的逻辑哪里有问题,将不胜感激。

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

int main() {
    // takes string input
    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);
    //turns the string to int
    int x = atoi(s);
    int temp = x, len = 0;
    //calculates string length
    while (x != 0) {
        x = x / 10;
        len++;
    }
    x = temp;
    //parses through the string and matches digits with each number
    for (int j = 0; j < 10; j++){
        int count = 0;
        for(int i = 0; i < len; i++){
            if(x % 10 == j){
                count++;
            }
            x = x / 10;
        }
        x = temp;
        printf("%d ", count);
    }
    return 0;
}

你的方法对于一个非常简单的任务来说太复杂了。这将做到:

void numberOfDigits(const char *s, int hist[10]) {
    while(*s) {
        if(isdigit(*s)) 
            hist[*s - '0']++;
        s++;
    }
}

可以这样使用:

int main(void) {
    char buf[1024];
    int hist[10];

    fgets(buf, sizeof buf, stdin);

    numberOfDigits(s, hist);

    for(int i=0; i<10; i++) 
        printf("Digit %d occurs %d times\n", i, hist[i]);
}

如果需要,这也可以在没有缓冲区的情况下很容易地实现:

int ch;
int hist[10];

while((ch = getchar()) != EOF) {
    if(isdigit(ch)) 
        hist[ch - '0']++;
}

编写一个正确合理的数数程序:

  • 不要为此分配任何缓冲区。
  • 创建一个数组来计算每个数字出现的次数。该数组应该有十个元素,每个数字一个。
  • 将数组的每个元素初始化为零。
  • 在循环中,一次读取一个字符。
  • 当读取例程(例如 getchar)指示文件结束或出现问题时离开循环,或者,如果需要,returns 换行符或您希望的其他字符用作输入结束指示。
  • 在循环内部,检查读取的字符是否为数字。如果读入的字符是数字,则将数组对应的元素递增。
  • 循环后,执行一个新的循环来遍历数字。
  • 在该循环内,对于每个数字,打印该数字的数组元素的计数。
#include <stdio.h>

int main(void) {
    int input = 1223330;
    int freq[10] = {0};
    
    input = abs(input);
    while(input)
    {
        freq[input%10]++;
        input /= 10;
    }

    for(int i=0; i<10; ++i)
    {
        printf("%d: %.*s\n", i, freq[i], "*************************************************");
    }
    
    return 0;
}

输出:

Success #stdin #stdout 0s 5668KB
0: *
1: *
2: **
3: ***
4: 
5: 
6: 
7: 
8: 
9: 

此应用目前受到 int 大小的限制(大约 9 或 10 位数字)。

您可以更新它以轻松使用 long long,这将使您达到大约 19 位数字。