这段代码是一个单词计数程序,但它只对字母"a"首先做一个打印b[27]的字符数组,然后使b[27]中的每个字符都是这个符号' "然后加上所有的加上所有组成a到z的字符但是当我运行的时候如果(b[i] + j == c[f]){它不检查所有的a到z,它只检查'a'字符如何修复
main() {
char b[27];
char c[10];
int counter = 0;
for (int i = 0; i < 1; ++i) {
b[i] = '`';
for (int j = 1; j < 27; ++j) {
b[i] + j;
if (b[i] + j > 'z' || b[i] + j < '`') {
break;
} else {
printf("%cn", b[i] + j);
for (int f = 0; f < 10; ++f) {
while ((c[f] = getchar()) != EOF) {
if (b[i] + j == c[f]) {
++counter;
printf("%c = %in", b[i]+j, counter);
}
}
}
}
}
}
}
看起来好像你在试图计算每个字母字符在输入流中出现的次数。
看起来您尝试从'`'
开始,因为它在'a'
之前出现,作为构建包含字母表的数组的一种方式。
这个for
循环似乎试图读取最多十个字符,
for (int f = 0; f < 10; ++f) {
while ((c[f] = getchar()) != EOF) {
但是while
循环试图读取整个输入流。
注意,如果char
(c[f]
的类型)在您的系统上是unsigned的,则不能正确地测试EOF
的负值。在处理getchar
的返回值时使用int
有不必要的嵌套循环。使用一个循环读取输入。使用单独的循环打印输出。
对于ASCII,'a' - 'a'
为0
,'b' - 'a'
为1
,以此类推,直到'z' - 'a'
为25
。使用这些值对数组进行索引,该数组保留每个字母字符的单独计数。翻转操作,从索引中检索一个字符(例如,'a' + 5
是'f'
)。
一个例子。这里我们忽略非字母字符,并且不区分大小写。
#include <ctype.h>
#include <stdio.h>
#define ALPHALEN 26
int main(void) {
unsigned counts[ALPHALEN] = { 0 };
int c;
while (EOF != (c = getchar()))
if (isalpha(c))
++counts[tolower(c) - 'a'];
for (int i = 0; i < ALPHALEN; i++)
printf("%c = %un", 'a' + i, counts[i]);
}
或者,使用fgets
读取输入行。
#include <ctype.h>
#include <stdio.h>
#define ALPHALEN 26
void alphacount(const char *str) {
unsigned counts[ALPHALEN] = { 0 };
while (*str) {
unsigned char c = (unsigned char) *str++;
if (isalpha(c))
++counts[tolower(c) - 'a'];
}
for (int i = 0; i < ALPHALEN; i++)
printf("%c = %un", 'a' + i, counts[i]);
}
int main(void) {
char buffer[512];
while (1) {
printf(">> ");
if (!fgets(buffer, sizeof buffer, stdin))
break;
alphacount(buffer);
}
}