我正在学习C语言,我必须制作一个程序,在其中输入一个字符串并调用函数,该函数会告诉您在字符串中重复次数最多的两个字母。但该函数返回错误的字母。事情是,我已经使用了我之前制作的程序片段,所以我不知道为什么它现在不工作。C - 程序不能正常工作,我错过了什么?
这里是困扰我的功能,我认为问题出现在第二个循环中,因为如果我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)条件不满足,则为5的slova [i]小于先前设置为7的znak1。
对不起这太长了,谢谢你的时间。
请编辑您的问题,以便它包含有意义的信息。 *程序不能正常工作*已经清除(如果它正常工作,您不需要在此发布),以及*我缺少什么*是简单的无意义噪声。您的标题应该描述您遇到的实际问题,这对未来在搜索结果中看到它的读者会有意义。 –
硬编码值'65'和'97'是'魔术'数字。 '魔术'数字使得代码更难理解,调试和维护。建议使用:'A'和'a'分别代替65和97 – user3629249
硬编码值'26'是一个'魔术'数字。 '魔术'数字使得代码更难理解,调试和维护。建议使用#define为该号码提供一个有意义的名称,并在整个代码/ – user3629249