在C中,我需要创建一个函数,对于输入,它将计算并显示每个字母出现的次数。
对于“Lorem ipsum dolor sit amet”的输入,该函数应返回类似于:
a: 0
b: 0
c: 0
d: 1
e: 2
f: 0
...
答案 0 :(得分:5)
所以你基本上需要读完整个文件char-by-char。假设你知道文件阅读是如何工作的,你需要做一些事情(道歉,自从我做了C之后已经有一段时间了):
if (isalpha(ch)) {
count[ch-'a']++;
}
/* rest of code where char pointer is moved on etc. */
您需要为其导入ctype库:
#include <ctype.h>
**忘了提,假设你会推断出以下内容:ch是你指向当前读入字符的指针,而count []是一个int [],初始化为所有零,大小为(26 * 2) = 52以满足大写和小写。如果大写和小写应该相同,则可以使用ctype库中也包含的tolower(int c)函数。在这种情况下,您只需要一个26个大小的数组。
if (isalpha(ch)) {
count[tolower(ch)-'a']++;
}
然后count []应包含每个字符的计数。
/ * * **** * /
如果只想用stdio.h库执行此操作,可以实现ctype.h库中使用的两个函数。
isalpha(int c)函数的简单实现可能类似于:
if (((int)c >= 'a' && (int)c <= 'z') || ((int)c >= 'A' && (int)c <= 'Z') {
return TRUE;
} else {
return FALSE;
}
(其中TRUE和FALSE属于您的返回类型和您定义的类型)。
一个真正简单的tolower版本可能是这样的:
if ((int)c >= 'A' && (int)c <= 'Z') {
return (int)c - 'a';
} else {
return (int)c;
}
你可能没有所有演员......
答案 1 :(得分:2)
提示:
char c[26] = { 0 }; // init
// read each input chars
++c[input-'a'];
答案 2 :(得分:1)
我会有一个数组(大小等于char域)并在适当的位置递增计数。
count[ch]++;
答案 3 :(得分:0)
以防万一你关注速度:
unsigned int chars [255],* p = text;
而(* p)的 字符[* P] ++;
for(int i = 0; i&lt; 255; i ++) if(i&gt;('A' - 1)&amp;&amp; i&lt;('Z'+ 1)) printf(“%c)%u / n”,i,chars [i];
对不起“/ n”,但我的mac pro在键盘上没有正确的字符......