逐字母阅读文本,不带字符串

时间:2019-04-16 03:29:41

标签: c

从用户处读取文本然后逐个计算下一个字母的最佳方法是什么?

例如,用户输入

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表用于更有效的方法,而不是将每个用户输入与字母表中的每个字母进行比较。

编辑:如何在不使用字符串的情况下运行所有​​输入字符串字符的循环?

3 个答案:

答案 0 :(得分:3)

您不必将每个用户输入与字母表中的每个字母进行比较。 您需要做的就是为26个英文字符创建一个大小为26的数组(假设您仅使用大写字母)。保持所有初始数组元素等于0。对所有输入字符串字符运行循环,并从该字符的ASCII值中减去65,这将为您提供该字符在数组中的位置,并将其值增加1。 enter image description here

答案 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]]);
    }
}