C - 程序无法正常工作,我缺少什么?

时间:2016-01-05 19:19:44

标签: c

我正在学习C,我必须创建一个程序,你输入一个字符串并调用函数,它告诉你2个字母在字符串中重复次数最多。但该函数返回错误的字母。问题是,我使用过我之前制作的程序片段,所以我不知道为什么它现在不起作用。

这是困扰我的功能,我认为问题出现在第二个for循环中,因为如果我printf字母表中每个字母的重复次数,那就完全是应该的,重复次数与字符串相比,每个字母都是正确的。但是第二个for循环仍然没有返回正确的字母。

void najcescaSlova( char *niz, int *znak) {
    int i, slova[26]={0}, duljina=0, znak1, znak2;

    while (niz[duljina] != '\0')
        ++duljina;

    for (i=0; i < duljina; ++i) {
        if (niz[i] >= 'A' && niz[i] <= 'Z')
            ++slova[niz[i] - 65];

        if (niz[i] >= 'a' && niz[i] <= 'z')
            ++slova[niz[i] - 97];
    }

    znak1 = znak2 = -1;

    for (i=0; i < 26; ++i) {
        if (slova[i] != 0) {
            if (slova[i] == znak1) {
                 znak2 = i;
            }

            if (slova[i] > znak1) {
                znak2 = znak1;
                znak1 = i;
            }

            if (slova[i] < znak1 && slova[i] > znak2) {
                znak2 = i;
            }
        }
    }

    znak[0] = znak1;
    znak[1] = znak2;

    return;
}

对不起,该程序是用我的母语,但如果你愿意,我可以关闭并重新打开这个问题。

slova [26]是保存每个字母重复次数的数组。

niz是输入字符串。

znak1和znak2是两个最大的字母,而znak1被视为最大的字母。

这里的东西是,slova [0]是7而slova [2]是5,所以当i = 0时,znak1被设置为0,因为0代表A,但是当i = 2时,znak1被设置为2 ,表示C,即使if(slova [i]> znak1)条件未满足,slova [i](即5)小于znak1,之前设置为7。

对不起,如果这太长了,谢谢你的时间。

4 个答案:

答案 0 :(得分:1)

当您编写slova[i] == znak1znak1 = i时,您会混淆i所持0-25字母索引的概念以及slova[i]中出现的次数的次数}。

在第二个for循环中,您需要两个变量来保存找到的第一个和第二个最高计数,另外两个变量用于保存与这些计数对应的字母的索引(可以使用znak[0]znak[1]这些,但我不确定变量命名在这一点是否变得奇怪)。这里有一个例子(假设znak数组已正确初始化):

    for (i=0; i < 26; ++i) {
        if (slova[i] != 0) {
            if (slova[i] == znak1) {
                 znak[1]= i;
                 znak1 = slova[i];
            }

            if (slova[i] > znak1) {
                znak[1] = znak[0];
                znak[0]= i;
                znak2 = znak1;
                znak1 = slova[i];
            }

            if (slova[i] < znak1 && slova[i] > znak2) {
                znak[1]= i;
                znak2 = slova[i]
             }
        }
    }

在这里,我使用znak[0]znak[1]作为第一和第二常见字母,znak1znak2作为这些字母的频率。

答案 1 :(得分:1)

您的问题是,znak1znak2的含义不明确?它们是最大字母的索引还是值?

如果它们是索引,则slova[i] == znak1之类的比较是错误的。它应该是slova[i] == slova[znak1]

但如果它们是值,则znak1 = i等分配是错误的。它应该是znak1 = slova[i]

答案 2 :(得分:0)

您已使用znak1znak2作为数组索引(integers)和最大字母(char)的值。

如果您想将它们用作数组索引,请将slova[i] == znak1更改为slova[i] == slova[znak1]

如果它们应该是最大的字母值,那么znak1 = i和类似的分配是不正确的。相反,您应该使用znak1 = slova[i]

答案 3 :(得分:0)

在以下答案中,当有多个具有相同高值的条目时,代码将选择第一次出现的高值。

  1. 始终尝试本地化数据
  2. 总是尝试编写仍然可以完成工作的最简单的代码
  3. 以...开头的所有复杂代码:

    znak1 = znak2 = -1;
    

    以及znak1和znak2的本地声明

    可以替换为以下简单代码:

        for (int i=0, znak_x = -1; i < 26; ++i)
        {
            if (slova[i] > znak_x)
            {
                znak_x = i;
            }
        }
    
        // eliminate this high count from the slova[] array
        slova[znak_x] = 0;
    
        // save the high count index into the caller's array
        znak[0] = znak_x; 
    
        for (int i=0, znak_x = -1; i < 26; ++i)
        {
            if (slova[i] > znak_x)
            {
                znak_x = i;
            }
        }
    
        // save the second high count index into the caller's array
        znak[1] = znak_x;
    } // end function:  najcescaSlova