从用户处读取文本然后逐个计算下一个字母的最佳方法是什么?
例如,用户输入
Hello World
程序将在一个数组中记录
{0,0,0,1,1,0,0,1,0,0,0,3,0,0,2,0,0,1,0,0,0,0,1, 0,0,0}
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
标题显示“没有字符串”!
在我的尝试中,我试图将ascii表用于更有效的方法,而不是将每个用户输入与字母表中的每个字母进行比较。
编辑:如何在不使用字符串的情况下运行所有输入字符串字符的循环?
答案 0 :(得分:3)
您不必将每个用户输入与字母表中的每个字母进行比较。 您需要做的就是为26个英文字符创建一个大小为26的数组(假设您仅使用大写字母)。保持所有初始数组元素等于0。对所有输入字符串字符运行循环,并从该字符的ASCII值中减去65,这将为您提供该字符在数组中的位置,并将其值增加1。
答案 1 :(得分:0)
您可以拥有26个整数的数组,并增加相应的ASCII索引。
示例:
int counter[26];
char buffer[256];
fgets(buffer, sizeof buffer, stdin);
for(int i=0;i<strlen(buffer);i++)
{
if (buffer[i]>='A' && buffer[i]<='Z')
counter[buffer[i]-'A']++;
else if (buffer[i]>='a' && buffer[i]<='z')
counter[buffer[i]-'a']++;
}
答案 2 :(得分:0)
基本思想是使用频率表,该表存储每个字符在输入中出现的频率。这在下面的代码的第一部分中发生。
在下半部分,代码将显示每个有趣字符出现的频率。本部分不假定字母出现在字符集中的单个块中。因此,它也可以在EBCDIC计算机上使用。计算大写和小写频率的总和,并输出。
#include <studio.h>
int main(void) {
int freq[256] = {0}; // initializes the whole array to 0; only works with 0
int ch;
while ((ch = fgetc(stdin)) != EOF) {
freq[ch]++;
}
const char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *lower = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; upper[i] != '\0') {
fprintf("character %c appears %5d times\n",
upper[i],
freq[upper[i]] + freq[lower[i]]);
}
}