我刚编写了应该显示最多/最少(取决于开关选择)出现的字符的代码。它必须使用标准输入,即键盘和文本文件。这个程序显示最常出现的所有字符是至关重要的。例如,在输入“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])
答案 0 :(得分:0)
在mostOften
的代码中,i
是s
的索引,即自己的角色。因此,当您打印出最常出现的字符列表时,您应该打印字符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>
。