Читать текст по буквам без строк - PullRequest
1 голос
/ 16 апреля 2019

Как лучше всего читать текст от пользователя, а затем считать буквы из следующего по одному?

Например, пользователь вводит

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}

ABCDEFGHIJKLMNOPQRSTU VWXYZ

Как видно из названия, нет строк!

Вмои попытки, я пытаюсь использовать таблицу ascii для более эффективного метода, вместо того, чтобы сравнивать каждый пользовательский ввод с каждой буквой алфавита.

РЕДАКТИРОВАТЬ: как запустить цикл всех символов входной строки без использования строки?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Вам не нужно сравнивать каждый пользовательский ввод с каждой буквой алфавита. Все, что вам нужно сделать, это создать массив размером 26 для 26 английских символов (при условии, что вы используете только символы верхнего регистра). Оставьте все начальные элементы массива равными 0. Запустите цикл для всех символов входной строки и вычтите 65 из значения ASCII этого символа, которое даст вам местоположение этого символа в массиве и увеличит его значение на 1. enter image description here

0 голосов
/ 16 апреля 2019

Основная идея состоит в том, чтобы использовать таблицу частот, которая хранит частоту появления каждого символа во входных данных. Это происходит в первой части кода ниже.

Во второй половине код печатает, как часто появляется каждый из интересных символов. Эта часть НЕ предполагает, что буквы появляются в одном блоке в наборе символов. Поэтому он также работает на компьютерах 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]]);
    }
}
0 голосов
/ 16 апреля 2019

Вы можете иметь массив из 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']++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...