大输入的数字频率程序

时间:2018-08-04 00:48:36

标签: c string frequency

我编写了以下程序,以找出字符数组中每个数字出现的次数。

int main(){

    char s[2000],count,j=0;
    fgets(s,2000,stdin);
    for(int i=0;i<=9;i++)
    {
        count=0;j=0;
        while(*(s+j))
        {
            if(isdigit(*(s+j)))
            {
                if(i==(*(s+j)-'0'))
                    count++;
            }
            j++;    
        }
     printf("%d ",count);    
    }
    return 0;
}

但是它不能用于大量输入。

b3n47b5xf13qlx233rg4u2c949i623e34nt5661se06b675utbpy258wz633855846l761d61x340h1vn19w191sj18v2u333556bh6m5uc4u050am05p961dhmpu6iq4667zg9 

预期输出为

5 10 5 12 8 11 15 4 4 6 

但是我得到的输出是

5 10 5 12 7 11 13 3 4 5 

有人可以帮我找出我哪里出了问题吗?

2 个答案:

答案 0 :(得分:4)

除了DYZ的答案,您的逻辑也很复杂。您无需同时测试if(isdigit(*(s+j)))if(i==(*(s+j)-'0')),只需要重构代码并提供单个测试并使用频率阵列即可。

(一个由10个元素初始化为全零的简单数组,在找到该数字后,您将递增与每个数​​字相对应的索引,从而导致该数字的计数在完成时出现在相应的索引处)

#include <stdio.h>
#include <ctype.h>

#define MAXC 2048   /* if you need a constant, #define one (or more) */
#define NDIGIT 10

int main (void) {

    char s[MAXC] = "";
    size_t digits[NDIGIT] = {0};    /* declare a 'frequency array' */

    while (fgets (s, MAXC, stdin)) {    /* read all blocks of data */
        char *p = s;                    /* pointer to s */
        while (*p) {                    /* for each char in s */
            if (isdigit (*p))           /* Am I a digit? */
                digits[*p - '0']++;     /* increment value at index */
            p++;                        /* increment pointer */
        }
    }

    for (int i = 0; i < NDIGIT; i++)
        printf (" %zu", digits[i]);
    putchar ('\n');

    return 0;
}

或者没有ctype.h

#include <stdio.h>

#define MAXC 2048   /* if you need a constant, #define one (or more) */
#define NDIGIT 10

int main (void) {

    char s[MAXC] = "";
    size_t digits[NDIGIT] = {0};    /* declare a 'frequency array' */

    while (fgets (s, MAXC, stdin)) {    /* read all blocks of data */
        char *p = s;                    /* pointer to s */
        while (*p) {                    /* for each char in s */
            if ('0' <= *p && *p <= '9') /* Am I a digit? */
                digits[*p - '0']++;     /* increment value at index */
            p++;                        /* increment pointer */
        }
    }

    for (int i = 0; i < NDIGIT; i++)
        printf (" %zu", digits[i]);
    putchar ('\n');

    return 0;
}

使用/输出示例

在两种情况下,输入的输出均为:

 5 10 5 12 8 11 15 4 4 6

仔细检查一下,如果还有其他问题,请告诉我。

答案 1 :(得分:2)

您将$ cmake --build out 声明为j(也声明了char,但这是另一个问题)。 (带符号的)count变量的最大值为127。当字符串包含128个以上字符时,char溢出:j变为-128而不是128。声明所有用于索引和计数为j+1int