它可以很好地达到某一点,就像A-G可以算得上一样。但它会打出像I或H这样的字母,并抛出一些疯狂的数字(如17亿次出现),然后尝试在图表中打印出许多星号。我一直对此不敢恭维,无法解决..这个for循环怎么了?有问题的for循环位于第2步
#include <stdio.h>
#define MAXROWS 100
#define NUM_ALPHABETS 26
int main(){
int count, i, j, k;
char sentence[MAXROWS];
char alphabets[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', '$
int frequency[NUM_ALPHABETS];
// step 1:Write a function that reads a sentence from the keyboard (2 pts)
printf("Please enter a sentence: \n");
fgets(sentence, sizeof(sentence), stdin);
// step 2:Find out the frequency of the alphabets in the sentence, ignore uppercase or lowercase in the sentence(4 pts)
for(i = 0; sentence[i] != "\n"; i++) {
for(j = 0; j < NUM_ALPHABETS; j++) {
if(tolower(sentence[i]) == tolower(alphabets[j])) {
frequency[j]++;
}
}
}
// step 3: Print the histogram as shown in the screenshot(4 pts)
printf("%12s%12s%10s\n", "Alphabets", "Frequency", "Histogram");
for(j = 0; j < NUM_ALPHABETS; j++) {
printf("%12c%12d ", alphabets[j], frequency[j]);
for(k = 0; k < frequency[j]; k++) {
printf("*");
}
printf("\n");
}
return 0;
}
它应该打印出一个图表,并且在一定程度上起作用。但是一旦它碰到了一些随机字母(每次都不相同),就会出现大约10亿或20亿次事件(有时甚至是负数)
答案 0 :(得分:0)
您是否依赖于将frequency []数组初始化为0s?
您还可以将步骤2编写为:
for(i = 0; sentence[i] != "\n"; i++) {
if (isalpha(sentence[i]) {
int index = tolower(sentence[i]) - 'a';
frequency[index ]++;
}
}
p.s。注意单引号与双引号:
for(i = 0; sentence[i] != "\n"; i++)
这些字符应该在'\ n'周围用单引号引起来,以表示字符。
正如其他人指出的那样,您需要初始化frequency
。有三种方法可以执行此操作:提供一个初始化程序,编写一个将每个元素设置为零的循环,或调用memset()
。这段代码可以完成所有三个操作:
int frequency[26] = { 0 };
for (int i = 0; i < 26; i++)
frequency[i] = 0;
memset(frequency, 0, sizeof(frequency));
请注意,frequency
的命名错误,因为它实际上包含每个字母的出现次数,而不是它们的出现频率。要获得频率,您必须除以读取的字符总数。 MAXROWS
也被错误命名,因为“行”与“行”同义;您可能想将其命名为MAXSENTENCELEN
或类似名称。
最后但并非最不重要的一点,alphabets
也被错误命名,因为它仅包含一个字母 ,但是实际上您根本不需要它。只需检查字符是否为字母,如果是,则使用它与'A'
或'a'
之间的差异作为frequency
的索引。要获得加分,请找出避免校验和减法的方法...(提示:ASCII中的大写字母和相应的小写字母的数值仅相差一位)