显示最少/最常出现的字符的程序

时间:2015-11-16 14:44:30

标签: c

我刚编写了应该显示最多/最少(取决于开关选择)出现的字符的代码。它必须使用标准输入,即键盘和文本文件。这个程序显示最常出现的所有字符是至关重要的。例如,在输入“abbcc”中,它应显示b和c。 它运行,但它不显示字符。问题是:为什么?

以下是代码:

a)主要

int main (int argc, char *argv[]) {
    int string;
    int allChars[256] = {0};
    while ( (string=getchar())!=EOF ) 
        allChars[string]++;
    if (argc < 2)
        mostOften(allChars);
    else {
        switch (argv[1][1]) {
        case 'm': case 'M':
            mostOften(allChars);
            break;
        case 'l': case 'L':
            leastOften(allChars);
            break;
        default:
            mostOften(allChars);
            break;
        } //switch
    } // else
} // main

b)sf.c

void mostOften(int *s) {
    int i, j;
    int max[256] = {0} ;
    int max_count = 1;
    for (i=0; i<256; i++) {
        if (s[i]) {
            if (s[i] > max_count) {
                for (j=0; j<256; j++)
                    max[j]=0;
                max[i]=1;
                max_count = s[i];
            } // 2nd_if
            else if (s[i] == max_count)
                max[i]=1;
            else
                continue;
        } // 1st_if
    } //1st_for
    printf("The most appearing characters are: ");
    for (i=0; i<256; i++) {
        if (max[i])
            putchar(s[i]);
    } //2nd_for
}

void leastOften(int *s) {
    int i, j;
    int min[256] = {0} ;
    int min_count = 1000;
    for (i=0; i<256; i++) {
        if (s[i]) {
            if (s[i] < min_count) {
                for (j=0; j<256; j++)
                    min[j]=0;
                min[i]=1;
                min_count = s[i];
            } // 2nd_if
            else if (s[i] == min_count)
                min[i]=1;
        } // 1st_if
    } //1st_for
    printf("The least appearing characters are: ");
    for (i=0; i<256; i++) {
        if (min[i])
            putchar(s[i]);
    } //2nd_for
}

谢谢。

EDIT1:删除了说明中的错误 EDIT2:从putchar(min [i]),putchar(max [i])更改为putchar(s [i])

2 个答案:

答案 0 :(得分:0)

mostOften的代码中,is的索引,即自己的角色。因此,当您打印出最常出现的字符列表时,您应该打印字符i而不是max[i]

for (i = 0; i < 256; i++) {
    if (max[i]) putchar(i);
}

另一种不需要将整个数组清零的方法是创建一个连续的字符列表。列表的长度是可变的,并保存在单独的变量nmax中。找到新的最大值时,只需将数组的长度设置为零即可。不要担心阵列内容; max仅保证有合理数据,最高可达nmax

void mostOften(int *s)
{
    int max[256];        // list of characters
    int nmax = 0;        // actual length of max array

    int max_count = 0;
    int i;

    for (i = 0; i < 256; i++) {
        if (s[i] && s[i] >= max_count) {
            if (s[i] > max_count) nmax = 0;

            max[nmax++] = i;
            max_count = s[i];
        }
    }

    for (i = 0; i < nmax; i++) printf("'%c'\n", max[i]);
}

答案 1 :(得分:0)

变化

printf("The most appearing characters are: ");
for (i=0; i<256; i++) {
    if (max[i])
        putchar(s[i]);
} //2nd_for

printf("The most appearing characters are: ");
for (i=0; i<256; i++) {
    if (max[i])
        putchar(i);
} //2nd_for

,因为您将s[i]生成为s[<char-value>] = <num-occurances-of-value>