【发布时间】:2025-12-04 23:00:01
【问题描述】:
我的一个项目遇到了一点小问题。我应该编写一个 c 程序来计算输入/文件中存在的每个字符。 (它应该是一个基本程序。)约束 - 我不能使用 math.h 库来生成日志函数并获得格式的输出:
1
5 1 2 0 2 2 5 8 4 3 6 6 2 5 5 7 2 1 1 2
7 9 8 1 7 2 4 1 0 0 4 5 0 2 2 5 2 6 3 6 6 3 7 0 2 2
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
该程序应该计算标准输入流中每个字母(不区分大小写)的出现次数并显示直方图。
如您所见,输出是垂直格式化的,每行打印字符位置的以 10 为底的数字。 现在,这可能看起来很愚蠢,但到目前为止我所拥有的是:
#include <stdio.h>
#include <ctype.h>
/*
int logBase10 (int num) {
method to calculate the log base 10 of num
}
*/
int main (int argc, char * argv[]) {
char alpha;
int count = 0;
int ascii[128] = {0};
while ( (alpha = getchar()) != EOF) {
count++;
ascii[(int)alpha]++;
alpha = getchar();
}
printf("Char \t Count \n");
printf("------------------------\n");
for (int i = 0; i < 127; i++) {
if(ascii[i] > 0) {
printf("%c \t %d \n", i, ascii[i]);
}
}
}
产生这样的输出:
Char Count
------------------------
5
93
, 6
- 2
. 3
; 2
C 2
I 6
N 1
T 1
W 2
a 26
b 5
c 8
d 13
e 55
f 11
g 7
h 28
i 32
k 3
l 26
m 17
n 31
o 27
p 12
q 1
r 26
s 22
t 42
u 11
v 8
w 8
y 13
z 1
首先,我的程序正在打印不需要的 ascii 字符(, ; - 等),我正在努力将打印功能更改为更垂直,但我根本无法弄清楚日志方法。我知道 log(10) 是 1,因为 10^1 是 1,但我无法弄清楚如何使用它来创建方法本身。另外,对于额外的字符,我尝试使用:
if(ascii[i] > 65 || ascii[i] < 90 || ascii[i] >= 97 || ascii[i] <= 122 ) {
printf("%c \t %d \n", i, ascii[i]);
}
无济于事。尝试这样做会产生更多乱码。
感谢任何帮助/反馈。
- 灵魂
【问题讨论】:
-
注意:不要使用
char alpha;,而是使用int alpha;来区分fgetc()的返回值:典型的256unsigned char和EOF。 -
至于您对信件的检查:
a > 65 || a < 90将适用于任何a。建议使用字符文字'A'而不是硬编码的 ASCII 值65。您可能还想看看来自<ctype.h>的isalpha。 -
int ascii[128]; ... ascii[(int)alpha]在alpha < 0 || alpha > 127时很危险。int alpha; int ascii[UCHAR_MAX+1]; ... ascii[alpha]更好。 -
我认为您需要 log 函数来确定显示的高度,即最大高度。位数。您实际上并不需要为此记录:将最高计数反复除以 10,并跟踪在达到零之前您可以除以的频率。
-
恕我直言,这个问题不像在自动取款机上问的那样好。这是太多的上下文。尝试更具体地说明您确切需要什么,并添加有关您尝试过的内容以及为什么您认为它不起作用的信息。跨度>
标签: c arrays count character logarithm